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