找到以下内容:列表中存储的任何一个子串(以先到者为准);在Python中更大的字符串中

时间:2017-11-10 06:27:50

标签: python string list

我是Python的新手。我已经通过了其他答案。我可以肯定地说这可能不是重复的。

基本上;让我们说例如,我想找到一个子串的出现(存储在列表中);如果找到了?我希望它停止搜索列表的其他子串!

更清楚地说明;

a = ['This', 'containing', 'many']
string1 = "This is a string containing many words"

如果您问自己,较大的字符串string1中的第一个单词与列表a中的单词匹配的单词是什么?答案为This,因为较大字符串string1中与子字符串列表a匹配的第一个单词是This

a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"

现在,我已经改变了string1了一下。如果您问自己,较大字符串string1中的第一个单词与列表a中的单词匹配的单词是什么?答案为containing,因为单词containing是出现在较大字符串string1中的第一个单词,它在子字符串a列表中也有匹配。< / p>

如果发现这样的匹配?我希望它停止搜索更多匹配!

我试过了:

string1 = "This is a string containing many words"

a = ['This', 'containing', 'many']

if any(x in string1 for x in a):

    print(a)

else:
    print("Nothing found")

上面的代码打印了整个子串列表。换句话说,它检查列表a中是否存在任何和所有子串,如果找到则;它打印整个子串列表。

我也试过查找String find()方法,但我似乎无法理解如何在我的情况下使用它

我正在寻找; 完全说出来:较大字符串中的第一个WORD匹配子字符串中的任何字词列表并打印该字词。

找到 WHICHEVER SUBSTRING(存储在SUBSTRINGS列表中)首先出现在BIGGER STRING 中并打印出特定的SUBSTRING。

6 个答案:

答案 0 :(得分:2)

您可以在此处使用set会员资格检查+ next

>>> a = {'This', 'containing', 'many'}
>>> next((v for v in string1.split() if v in a), 'Nothing Found!')
'This'

这应该给你(可能更好)O(N)性能,因为我们使用next来查找第一个值,并且设置成员资格测试是恒定时间。

答案 1 :(得分:1)

我认为这可以在不分割string1的情况下通过匹配列表的元素来完成。对于第一场比赛,请使用break停止执行。

string1 = "This is a string containing many words"
a = ['This', 'containing', 'many']

for x in a:
    if x in string1:
        print(x)
        break
else:
    print("Nothing found")

列表理解

l=[x for x in a if x in string1]
if l:
    print(l[0])
else:
    print("Nothing found")

答案 2 :(得分:1)

您可以在此处使用re

import re
a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"
print re.search(r"\b(?:"+"|".join(a)+r")\b", string1).group()

输出:

containing


s="""
a = ['This', 'containing', 'many']
a=set(a)
string1 = 'is a string containing many words This '
c=next((v for v in string1.split() if v in a), 'Nothing Found!')
"""
s1="""
a = ['This', 'containing', 'many']
string1 = "is a string containing many words This "
re.search(r"\b(?:"+"|".join(a)+r")\b", string1)
"""
print timeit.timeit(stmt=s,number=1000000)
print timeit.timeit(stmt=s1,number=1000000, setup="import re")

答案 3 :(得分:0)

有两种方法可以解决这个问题。一个是使用

  

string.find(&#39;子&#39)

将返回&#39; substring&#39;的第一个出现的索引的方法在string1中,或者如果没有出现&#39; substring&#39;,则可能返回-1。在string1中。通过遍历搜索项列表a,您将拥有一组标记,每个标记对应于列表中的一个单词。列表中最小的非negative_one值将是您的第一个单词的索引。这非常复杂,但不需要在实际字符串上进行任何循环。

另一种选择是使用

  

string1.split(&#39;&#39;)

创建字符串中所有单词的列表。然后,您可以通过for循环查看此列​​表,并检查string1列表中的每个项目是否与任何其他项目相对应。这将是一个很好的学习机会,可以自己尝试,但如果我太模糊或者代码会更有帮助,请告诉我。

希望这有帮助!

答案 4 :(得分:0)

a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"

Break是更好的选择,但是那个解决方案已经存在,所以我想表明你也可以用切片来做:

print("".join([item for item in string1.split() if item in a][:1]))

以上列表理解与:

相同
new=[]
for item in string1.split():
    if item in a:
        new.append(item)

print("".join(new[:1]))

答案 5 :(得分:-1)

a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"

newList = string1.split(" ");
for i in newList:
    if i in a:
        print(i);
        break

这样做。

更多阅读本文。 https://docs.python.org/2/library/string.html