Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法

Posted

技术标签:

【中文标题】Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法【英文标题】:Python: Elegant way to check if at least one regex in list matches a stringPython:检查列表中至少一个正则表达式是否与字符串匹配的优雅方法 【发布时间】:2011-03-03 17:07:39 【问题描述】:

我有一个 python 中的正则表达式列表和一个字符串。有没有一种优雅的方法来检查列表中的至少一个正则表达式是否与字符串匹配?优雅,我的意思是比简单地遍历所有正则表达式并根据字符串检查它们并在找到匹配项时停止更好。

基本上,我有这个代码:

list = ['something','another','thing','hello']
string = 'hi'
if string in list:
  pass # do something
else:
  pass # do something else

现在我想在列表中有一些正则表达式,而不仅仅是字符串,我想知道是否有一个优雅的解决方案来检查匹配以替换 if string in list:

提前致谢。

【问题讨论】:

python 没有 emacs lisp 的 regexp-opt gnu.org/software/emacs/manual/html_node/elisp/… 你为什么不喜欢循环? @MartinThoma 因为它是 O(n) 那么问题不应该是“优雅”,而是“小于 O(n)”。 a) 你的意思是“性能”而不是“优雅” b) 你想知道哪个正则表达式匹配(但这并不意味着你需要单独迭代每个正则表达式,这将不可扩展)。 【参考方案1】:
import re

regexes = [
    "foo.*",
    "bar.*",
    "qu*x"
    ]

# Make a regex that matches if any of our regexes match.
combined = "(" + ")|(".join(regexes) + ")"

if re.match(combined, mystring):
    print "Some regex matched!"

【讨论】:

如果你不需要知道哪个匹配,最好用(?:regex)括起来而不是(regex) 如果数组中有超过 100 个正则表达式 (Python 2.6),则此方法不起作用。在下面尝试 nosklo 的答案。 regexes = '(?:%s)' % '|'.join(regexes) 因为“qu*x”的意思是,q,零个或多个u,和一个x。 在上面的答案中我怎样才能知道哪个正则表达式匹配?【参考方案2】:
import re

regexes = [
    # your regexes here
    re.compile('hi'),
#    re.compile(...),
#    re.compile(...),
#    re.compile(...),
]

mystring = 'hi'

if any(regex.match(mystring) for regex in regexes):
    print 'Some regex matched!'

【讨论】:

如果在 python 2.4 中工作,您将没有 any - 请参阅 ***.com/questions/3785433/… “比简单地遍历所有正则表达式并根据字符串检查它们并在找到匹配项时停止更好”?我猜 Ned 和这个答案的结合可能是赢家……【参考方案3】:

这是我根据其他答案所追求的:

raw_list = ["some_regex","some_regex","some_regex","some_regex"]
reg_list = map(re.compile, raw_list)

mystring = "some_string"

if any(regex.match(mystring) for regex in reg_list):
    print("matched")

【讨论】:

【参考方案4】:

混合了 Ned 和 Nosklo 的答案。保证适用于任何长度的列表...希望您喜欢

import re   
raw_lst = ["foo.*",
          "bar.*",
          "(Spam.0,3)1,3"]

reg_lst = []
for raw_regex in raw_lst:
    reg_lst.append(re.compile(raw_regex))

mystring = "Spam, Spam, Spam!"
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst):
    print("something matched")

【讨论】:

【参考方案5】:

如果你遍历字符串,时间复杂度将是 O(n)。更好的方法是将这些正则表达式组合为一个正则表达式。

【讨论】:

以上是关于Python:检查列表中至少一个正则表达式是不是与字符串匹配的优雅方法的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中,我可以在不使用正则表达式的情况下检查字符串是不是包含字母吗?

SQL正则表达式检查JSON数组中是否存在至少一个项目

python中用正则表达式检查密码是否安全

有效地检查一个元素是不是在列表中至少出现 n 次

检查字符串是不是与python中的IP地址模式匹配?

如何检查字符串是不是与 node.js 中的任何正则表达式数组匹配?