检查列表中是否有一个或多个字符串与正则表达式匹配

9
如果需要说的话
if <this list has a string in it that matches this rexeg>:
    do_stuff()

发现了一种强大的构造,可以从列表中提取匹配的字符串:

[m.group(1) for l in my_list for m in [my_regex.search(l)] if m]

...但这很难读并且过于复杂。我不需要列表,我只想知道这样的列表中是否有任何内容。

有没有更简单易懂的方法来得到答案?

1个回答

7
您可以简单地使用any。演示:
>>> lst = ['hello', '123', 'SO']
>>> any(re.search('\d', s) for s in lst)
True
>>> any(re.search('\d{4}', s) for s in lst)
False

如果你想强制从字符串的开头进行匹配,请使用re.match

说明:

any会检查可迭代对象中是否存在任何真值。在第一个示例中,我们传递了以下列表的内容(以生成器的形式):

>>> [re.search('\d', s) for s in lst]
[None, <_sre.SRE_Match object at 0x7f15ef317d30>, None]

此处有一个匹配对象,该对象为真值。而在布尔情境下,None 总是会被视为 False。这就是为什么第二个例子中 any 会返回 False 的原因:

>>> [re.search('\d{4}', s) for s in lst]
[None, None, None]

简单而甜美的REPL示例! - zedfoxus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接