如何检查字符串是不是是字符串列表中项目的子字符串?

Posted

技术标签:

【中文标题】如何检查字符串是不是是字符串列表中项目的子字符串?【英文标题】:How to check if a string is a substring of items in a list of strings?如何检查字符串是否是字符串列表中项目的子字符串? 【发布时间】:2011-06-18 02:35:14 【问题描述】:

我有一个清单:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

并且想要搜索包含字符串'abc' 的项目。我该怎么做?

if 'abc' in my_list:

将检查'abc' 是否存在于列表中,但它是'abc-123''abc-456' 的一部分,'abc' 本身不存在。那么如何获取所有包含'abc'的项目呢?

【问题讨论】:

检查相反(如果一个字符串包含多个字符串中的一个):***.com/a/6531704/2436175 如果条目的左边部分是唯一的,考虑从列表中构造一个字典:Find an entry in a list based on a partial string 另见 Raymond Hettinger 的 this answer(这应该是这个问题的答案)。 【参考方案1】:

如果您只需要知道“abc”是否在其中一项中,这是最短的方法:

if 'abc' in str(my_list):

注意:这里假定“abc”是一个字母数字文本。如果 'abc' 可能只是一个特殊字符(即 []', ),请不要使用它。

【讨论】:

如果你有一个 ["abc1", "1abc2"] 列表,这将失败,因为它会找到匹配项,因为字符串 'abc' 将在新创建的字符串中 是的,这是预期的行为......如果任何项目包含'abc',则为true 我不知道为什么所有这些人在不需要的时候决定做那些复杂的 lambda 解决方案!干得好@RogerS 其实同一个问题几乎可以自己回答...我只是添加了 3 个字母。 这是一个很好的解决方案,但是如果你想找到包含给定字符串的项目,你将不会成功。在这里您可以了解 any 项是否包含该字符串。【参考方案2】:

我是 Python 新手。我得到了下面的代码并使其易于理解:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
    if 'abc' in item:
       print(item)

【讨论】:

【参考方案3】:

将 nan 添加到列表中,以下对我有用:

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456',np.nan]
any([i for i in [x for x in some_list if str(x) != 'nan'] if "abc" in i])

【讨论】:

【参考方案4】:

如果要获取多个子字符串的数据列表

你可以这样改

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
# select element where "abc" or "ghi" is included
find_1 = "abc"
find_2 = "ghi"
result = [element for element in some_list if find_1 in element or find_2 in element] 
# Output ['abc-123', 'ghi-789', 'abc-456']

【讨论】:

【参考方案5】:

我需要与匹配项对应的列表索引,如下所示:

lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']

[n for n, x in enumerate(lst) if 'abc' in x]

输出

[0, 3]

【讨论】:

【参考方案6】:

只是把它扔在那里:如果您碰巧需要匹配多个字符串,例如abcdef,您可以组合两种理解,如下所示:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

输出:

['abc-123', 'def-456', 'abc-456']

【讨论】:

这正是我在谷歌上搜索的内容。谢谢! 你也可以使用s for s in my_list for xs in matchers if xs in s(注意花括号来创建一个独特的集合)。可能更容易阅读,但如果大多数 s 值都匹配,则可能会更慢,因为您的 any 将在第一个匹配时有效地停止。【参考方案7】:
def find_dog(new_ls):
    splt = new_ls.split()
    if 'dog' in splt:
        print("True")
    else:
        print('False')


find_dog("Is there a dog here?")

【讨论】:

【参考方案8】:

使用Pythons字符串类的__contains__()方法:

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")

【讨论】:

【参考方案9】:

我做了一个搜索,需要你输入一个特定的值,然后它会从包含你输入的列表中寻找一个值:

my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

尝试搜索“abc”。

【讨论】:

【参考方案10】:
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

【讨论】:

在 Python3.6 中会报错:TypeError: expected string or bytes-like object @AimForClarity 是的。 python3.6 中的 re.findall 需要一个字符串。另一种方法是将列表转换为字符串import remylist=['abc','def','ghi','abcff']my_list_string=''.join(mylist)string_to_find="abc" res=re.findall(string_to_find,my_list_string)print(res) 很抱歉格式不好。由于某种原因无法正确换行。【参考方案11】:

问题:给出abc的信息

    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']


    aa = [ string for string in a if  "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

【讨论】:

【参考方案12】:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

for item in my_list:
    if (item.find('abc')) != -1:
        print ('Found at ', item)

【讨论】:

【参考方案13】:

如果您只想检查列表中任何字符串中是否存在abc,您可以尝试

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever

如果你真的想获取所有包含abc的项目,请使用

matching = [s for s in some_list if "abc" in s]

【讨论】:

@OlivierPons,就做if myitem in myarray: 另一种获取所有包含子字符串'abc'的字符串的方法:filter(lambda element: 'abc' in element, some_list) @p014k:使用index()方法:try: return mylist.index(myitem); except ValueError: pass @midkin:我既不明白你到底想做什么,也不明白它是怎么出错的。通过提出一个新问题(使用“”按钮)、复制您的确切代码、您希望代码做什么以及它实际做了什么,您可能会获得更多的运气。 “没有工作”是完全没有意义的,除非你在这种情况下定义“工作”是什么意思,但即便如此,最好解释实际发生的事情,而不是说没有发生的事情。 @LarryCai 检查"abc" in some_string 将检查"abc" 是否存在作为some_string 的精确连续子字符串,因此"abc" in "cba-4123""abc" in "a-b-c" 都将返回False。无需修改代码。【参考方案14】:

使用filter 获取具有abc 的元素。

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

您也可以使用列表推导式。

>>> [x for x in lst if 'abc' in x]

顺便说一句,不要使用单词list 作为变量名,因为它已经用于list 类型。

【讨论】:

【参考方案15】:
for item in my_list:
    if item.find("abc") != -1:
        print item

【讨论】:

如果你打算采用这种方法,我认为使用if 'abc' in item 而不是使用item.find('abc') == -1 会更惯用。【参考方案16】:
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]

【讨论】:

【参考方案17】:

这是一个相当老的问题,但我提供这个答案是因为以前的答案不能处理列表中不是字符串(或某种可迭代对象)的项目。这样的项目会导致整个列表理解失败并出现异常。

要通过跳过不可迭代的项目来优雅地处理列表中的此类项目,请使用以下内容:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

那么,有了这样一个列表:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

你仍然会得到匹配的项目 (['abc-123', 'abc-456'])

iterable 的测试可能不是最好的。从这里得到它:In Python, how do I determine if an object is iterable?

【讨论】:

[el for el in lst if el and (st in el)] 在给定的示例中不会更有意义吗? @tinix 我不会优雅地处理不可迭代的对象,对吗? “给定的例子”my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456'] 无需过于复杂。 是的,绝对是 - 接受的答案非常合适,我的建议更复杂,所以请随意忽略它 - 我只是提供以防有人遇到与我相同的问题:不可迭代的项目尽管在给定的示例中不存在此类列表,但在现实世界中是可能的。【参考方案18】:
any('abc' in item for item in mylist)

【讨论】:

以上是关于如何检查字符串是不是是字符串列表中项目的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

检查一对字符串是不是是压缩列表的子字符串 - python

检查字符串是不是包含子字符串列表并保存匹配的子字符串

Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]

如何检查字符串是不是在列表中,使用每个项目上的函数(python3)[重复]

如何检查字符串是不是包含 JavaScript 预定义数组中存在的子字符串?

如何检查字符串是不是包含 JavaScript 中的子字符串?