查找:存储在列表中的任何一个子字符串(以先出现的为准);在Python中使用更大的字符串

查找:存储在列表中的任何一个子字符串(以先出现的为准);在Python中使用更大的字符串,python,string,list,Python,String,List,我是Python新手。我已经看过其他答案了。。我可以肯定地说,这可能不是重复的 基本上;比如说,我想找到其中一个子字符串(存储在列表中)的出现点;如果找到呢?我希望它停止搜索列表中的其他子字符串 更清楚地说明 a = ['This', 'containing', 'many'] string1 = "This is a string containing many words" 如果你问自己,大字符串string1中与列表a中的单词匹配的第一个单词是什么?答案将是This,因为与子字符串a列表

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

基本上;比如说,我想找到其中一个子字符串(存储在列表中)的出现点;如果找到呢?我希望它停止搜索列表中的其他子字符串

更清楚地说明

a = ['This', 'containing', 'many']
string1 = "This is a string containing many words"
如果你问自己,大字符串
string1
中与列表
a
中的单词匹配的第一个单词是什么?答案将是
This
,因为与子字符串
a
列表匹配的较大字符串
string1
中的第一个单词是
This

a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"
现在,我对string1做了一些更改。如果你问自己,大字符串
string1
中与列表
a
中的单词匹配的第一个单词是什么?答案将是
containing
,因为单词
containing
是出现在较大字符串
string1
中的第一个单词,该字符串在子字符串
a
列表中也有匹配项

如果找到了这样的匹配?我希望它停止搜索更多的匹配项

我试过这个:

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()方法,但我似乎不明白如何在我的案例中准确地使用它

我在寻找; 要准确地拼写它:与子字符串中的任何单词列表匹配的较大字符串中的第一个单词,然后打印该单词


要查找较大字符串中最先出现的子字符串(存储在子字符串列表中)并打印该特定子字符串,有两种方法。一个是使用

string.find('子字符串')

方法,该方法将返回string1中第一次出现的“substring”的索引,如果string1中没有出现“substring”,则可能返回-1。通过迭代搜索词a的列表,您将拥有一组标记,每个标记对应于列表中的一个单词。列表中最小的非负值是第一个单词的索引。这非常复杂,但不需要在实际字符串上进行任何类型的循环

另一种选择是使用

字符串1.拆分(“”)

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


希望这有帮助

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

string.find('子字符串')

方法,该方法将返回string1中第一次出现的“substring”的索引,如果string1中没有出现“substring”,则可能返回-1。通过迭代搜索词a的列表,您将拥有一组标记,每个标记对应于列表中的一个单词。列表中最小的非负值是第一个单词的索引。这非常复杂,但不需要在实际字符串上进行任何类型的循环

另一种选择是使用

字符串1.拆分(“”)

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


希望这有帮助

我认为这可以在不拆分
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")

我认为这可以在不拆分
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")

您可以在此处使用
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()
>>> a = {'This', 'containing', 'many'}
>>> next((v for v in string1.split() if v in a), 'Nothing Found!')
'This'
输出:

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")

您可以在此处使用
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()
>>> a = {'This', 'containing', 'many'}
>>> next((v for v in string1.split() if v in a), 'Nothing Found!')
'This'
输出:

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")

您可以在此处使用
set
membership check+
next

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()
>>> a = {'This', 'containing', 'many'}
>>> next((v for v in string1.split() if v in a), 'Nothing Found!')
'This'

这将为您提供(可能比)O(N)性能,因为我们使用
next
只查找第一个值,并且集合成员资格测试是恒定时间

您可以在此处使用
设置
成员资格检查+
下一步

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()
>>> a = {'This', 'containing', 'many'}
>>> next((v for v in string1.split() if v in a), 'Nothing Found!')
'This'
a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"
这将为您提供(可能比)O(N)性能,因为我们使用
next
只查找第一个值,并且集合成员资格测试是恒定时间

a = ['This', 'containing', 'many']
string1 = "kappa pride pogchamp containing this string this many words"
Break是更好的选择,但该解决方案已经存在,所以我想展示一下您也可以使用slice:

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]))
Break是更好的选择,但该解决方案已经存在,所以我想展示一下您也可以使用slice:

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]))

请注意,这会在O(n**2)时间内重复执行字符串检查。@cᴏʟᴅsᴘᴇᴇᴅ 如果string1中的x是罪魁祸首->
?是的,就是这样。请注意,这会在O(n**2)时间内重复进行字符串检查。@cᴏʟᴅsᴘᴇᴇᴅ 这就是罪魁祸首吗->
如果string1中的x是的,就是这样。阿披舍克,我误解了你的问题。现在看看我的编辑,我想它应该能完全解决你的问题。阿披舍克,我误解了你的问题。现在看看我的编辑,我想它应该能完全解决你的问题。我已经在我的答案中粘贴了代码…一定要检查它out@vks见教育署