gpt4 book ai didi

python - 检查字符串是否包含一定数量的另一个字符串的单词

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:43 24 4
gpt4 key购买 nike

假设我们有一个字符串 1 A B C D E F 和一个字符串 2 B D E(这些字母只是为了演示,实际上它们是单词)。现在我想找出字符串 1 中的字符串 2 中是否有任何 n 连续“单词”。要将字符串转换为“单词”,我会使用 string.split( )

例如 n 等于 2,我想检查 B DD E 是否 - 按此顺序 - 在字符串 1 中。B D 在字符串中不是按此顺序,但 D E 是。

有没有人看到这样做的 pythonic 方式?

我确实有一个n 等于 2 的解决方案,但我意识到我需要它来处理任意 n。它也不是特别漂亮:

def string_contains_words_of_string(words_str, words_to_check_str):
words = words_str.split()
words_to_check = words_to_check_str.split()

found_word_index = None
for word in words:
start = 0 if found_word_index is None else found_word_index + 1
for i, word_to_check in enumerate(words_to_check[start:]):
if word_to_check == word:
if found_word_index is not None:
return True
found_word_index = i
break
else:
found_word_index = None
return False

最佳答案

使用正则表达式很容易:

>>> import re
>>> st1='A B C D E F'
>>> st2='B D E'
>>> n=2
>>> pat=r'(?=({}))'.format(r's+'.join(r'\w+' for i in range(n)))
>>> print [(s, s in st1) for s in re.findall(pat, st2)]
[('B D', False), ('D E', True)]

关键是使用零宽度前瞻来查找字符串中的重叠匹配项。所以:

>>> re.findall('(?=(\\w+\\s+\\w+))', 'B D E')
['B D', 'D E']

现在为 \w+ 找到的单词重复 n 次构建它:

>>> n=2
>>> r'(?=({}))'.format(r's\+'.join(r'\w+' for i in range(n)))
'(?=(\\w+\\s+\\w+))'

现在,由于您有两个字符串,使用 Python 的 in 运算符生成 s 结果的元组,从正则表达式匹配到目标字符串。


当然,如果你想要一个非正则表达式来做这个,只需通过 n 产生子字符串 n 个单词:

>>> li=st2.split()
>>> n=2
>>> [(s, s in st1) for s in (' '.join(li[i:i+n]) for i in range(len(li)-n+1))]
[('B D', False), ('D E', True)]

如果你想要索引(任何一种方法),你可以使用 str.find :

>>> [(s, st1.find(s)) for s in (' '.join(li[i:i+n]) for i in range(len(li)-n+1)) 
... if s in st1]
[('D E', 6)]

对于逐字逐句的正则表达式,请确保使用单词边界 anchor :

>>> st='wordW wordX wordY wordZ'
>>> re.findall(r'(?=(\b\w+\s\b\w+))', st)
['wordW wordX', 'wordX wordY', 'wordY wordZ']

关于python - 检查字符串是否包含一定数量的另一个字符串的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23018780/

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