我想检查一个字符串是否包含子字符串的所有单词并保留它们的顺序;目前我正在使用以下代码;然而,它是非常基本的,似乎效率低下,并且可能有更好的方法来做到这一点。如果您能告诉我什么是更有效的解决方案,我将非常感激。抱歉,我提出了一个菜鸟问题,我是编程新手,无法找到好的解决方案
def check(main, sub_split):
n=0
while n < len(sub_split):
result = True
if sub_split[n] in main:
the_start = main.find(sub_split[n])
main = main[the_start:]
else:
result=False
n += 1
return result
a = "I believe that the biggest castle in the world is Prague Castle "
b= "the biggest castle".split(' ')
print check(a, b)
更新:有趣;首先感谢大家的回答。也感谢您指出我的代码遗漏的一些地方。我一直在尝试在此处和链接中发布的不同解决方案,我将添加更新它们如何比较并接受答案。
更新: 再次感谢大家提供了出色的解决方案,与我的代码相比,它们中的每一个都有重大改进;我检查了这些建议和我的100000次检查的要求,得到了以下结果; 建议者: Padraic Cunningham - 始终低于 0.4 秒(尽管在仅搜索完整单词时会出现一些误报; 银河 - 0.65 秒; 0.75秒 友好的狗 - 0.70 秒 John1024 - 1.3 秒(高度准确,但似乎需要额外时间)
最佳答案
您可以通过将上一个匹配项的索引 + 1 传递给 find 来简化搜索,无需切片任何内容:
def check(main, sub_split):
ind = -1
for word in sub_split:
ind = main.find(word, ind+1)
if ind == -1:
return False
return True
a = "I believe that the biggest castle in the world is Prague Castle "
b= "the biggest castle".split(' ')
print check(a, b)
如果ind是-1那么你之后就没有匹配所以你返回False,如果你彻底了解了所有单词那么所有单词都按顺序在字符串中.
对于确切的单词,您可以对列表执行类似的操作:
def check(main, sub_split):
lst, ind = main.split(), -1
for word in sub_split:
try:
ind = lst.index(word, ind + 1)
except ValueError:
return False
return True
要处理标点符号,您可以先将其删除:
from string import punctuation
def check(main, sub_split):
ind = -1
lst = [w.strip(punctuation) for w in main.split()]
for word in (w.strip(punctuation) for w sub_split):
try:
ind = lst.index(word, ind + 1)
except ValueError:
return False
return True
当然,有些单词带有标点符号是有效的,但这更多是 nltk 的工作,或者您实际上可能想找到包含任何标点符号的匹配项。
关于python - python 检查一个字符串是否包含另一个字符串中相同顺序的所有单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260436/