【发布时间】:2012-02-11 21:35:00
【问题描述】:
有没有办法查看一行是否包含与一组正则表达式模式匹配的单词?
如果我有[regex1, regex2, regex3],并且我想查看一行是否与其中任何一个匹配,我该怎么做?
现在,我使用的是re.findall(regex1, line),但它一次只能匹配 1 个正则表达式。
【问题讨论】:
有没有办法查看一行是否包含与一组正则表达式模式匹配的单词?
如果我有[regex1, regex2, regex3],并且我想查看一行是否与其中任何一个匹配,我该怎么做?
现在,我使用的是re.findall(regex1, line),但它一次只能匹配 1 个正则表达式。
【问题讨论】:
您可以使用内置函数 any(或 all,如果所有正则表达式都必须匹配)和生成器表达式来循环遍历所有正则表达式对象。
any (regex.match(line) for regex in [regex1, regex2, regex3])
(当然,如果正则表达式不是预编译的正则表达式对象,则为 any(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2]))
但是,与将正则表达式组合在一个表达式中相比,这将是低效的。如果此代码对时间或 CPU 至关重要,您应该尝试编写一个包含所有需求的正则表达式,使用特殊的 | 正则表达式运算符来分隔原始表达式。
组合所有正则表达式的简单方法是使用字符串join 方法:
re.match("|".join([regex_str1, regex_str2, regex_str2]), line)
关于以这种方式组合正则表达式的警告:如果原始表达式已经使用| 运算符,则可能导致错误的表达式。
【讨论】:
'(' + ')|('.join(['foo', 'bar', 'baz']) + ')' 给'(foo)|(bar)|(baz)'。
(?:...) 中,并以突出其逻辑结构的方式将字符串放在一起。以'|'.join('(?:{0})'.format(x) for x in ('foo', 'bar', 'baz')) 为例。
#quite new to python but had the same problem. made this to find all with multiple
#regular #expressions.
regex1 = r"your regex here"
regex2 = r"your regex here"
regex3 = r"your regex here"
regexList = [regex1, regex1, regex3]
for x in regexList:
if re.findall(x, your string):
some_list = re.findall(x, your string)
for y in some_list:
found_regex_list.append(y)#make a list to add them to.
【讨论】:
您可以遍历正则表达式项并进行搜索。
regexList = [regex1, regex2, regex3]
line = 'line of data'
gotMatch = False
for regex in regexList:
s = re.search(regex,line)
if s:
gotMatch = True
break
if gotMatch:
doSomething()
【讨论】:
试试这个新的正则表达式:(regex1)|(regex2)|(regex3)。这将匹配包含其中任何 3 个正则表达式的行。
【讨论】:
(?:...) 在这里可能比(...) 更好,以避免创建虚假的捕获组。
.group(n) 的真实性以确定您捕获了哪个组。