gpt4 book ai didi

python - 使用正则表达式在Python中查找字符串的三个部分

转载 作者:行者123 更新时间:2023-12-01 06:02:17 25 4
gpt4 key购买 nike

我有三个字符串,它是三个组件的串联:

  • 列表 1 中的一个单词(包括空字符串)
  • 列表 2 中的一个单词
  • 列表 3 中的一个单词(包括空字符串)

列表 1、2 和 3 最多可以包含 5000 个元素。一个列表中的元素不在其他列表中(空字符串除外)。但是,有些单词可以是其他单词的一部分。

我正在寻找一种有效的方法来找到这三个组件。现在我正在做以下事情:

for word in list2:
if word in long_word:
try:
[bef, aft] = long_word.split(word)
except ValueError: # too many values to unpack
continue
if bef in list1 and aft in list3:
print('Found: {}, {}, {}'.format(bef, word, aft))
break
else:
print('Not found')

不知道有没有更好的办法。我考虑过在正则表达式中使用管道。但正如我得到的那样,替代方案的数量似乎太大了:OverflowError:超出了正则表达式代码大小限制。

谢谢

更新

我尝试了建议解决方案的修改版本:

def fj(long_word, list1, list2, list3):
for x in filter(long_word.startswith, list1):
for y in filter(long_word[len(x):].startswith, list2):
z = long_word[len(x)+len(y):]
if z in list3:
yield x, y, z

def sid(long_word, list1, list2, list3):
for w1 in list1:
if not long_word.startswith(w1):
continue
cut1 = long_word[len(w1):]
for w2 in list2:
if not cut1.startswith(w2):
continue
cut2 = cut1[len(w2):]
for w3 in list3:
if cut2 == w3:
yield w1, w2, w3

def my(long_word, list1, list2, list3):
for word in list2:
if word in long_word:
try:
[bef, aft] = long_word.split(word)
except ValueError: # too many values to unpack
continue
if bef in list1 and aft in list3:
yield bef, word, aft

这是我使用包含 8000 个元素的列表重复 10000 次得到的计时结果(标准化),每次从每个列表中随机选取一个单词来生成 long_word

  • 我的:1.0
  • sid:4.5
  • fj:2.7

我真的很惊讶,因为我认为 fj 的方法是最快的。

最佳答案

正则表达式可能不太适合这里,我可能会这样处理:

for x in filter(long_word.startswith, list1):
for y in filter(long_word[len(x):].startswith, list2):
z = long_word[len(x)+len(y):]
if z in list3:
print('Found: {}, {}, {}'.format(x, y, z))
break
else:
continue
break
else:
print('Not found')

关于python - 使用正则表达式在Python中查找字符串的三个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9742810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com