使用Python将一行与多个正则表达式匹配

egi*_*dra 16 python regex

有没有办法看一行是否包含与一组正则表达式模式匹配的单词?如果我有[regex1, regex2, regex3],并且我想看一条线是否匹配其中任何一条,我该怎么做?现在,我正在使用re.findall(regex1, line),但它一次只匹配1个正则表达式.

jsb*_*eno 36

您可以使用内置函数any(或者all如果所有正则表达式都必须匹配)和Generator表达式来遍历所有正则表达式对象.

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('(?:{0})'.格式(x)for x in('foo','bar','baz'))`例如. (7认同)
  • 如果将每个表达式包装在括号中,则可以使连接方法不太可能失败.`'('+')|('.join(['foo','bar','baz'])+')'`给`'(foo)|(bar)|(baz)'`. (3认同)

tha*_*ren 8

您可以循环遍历正则表达式项目并进行搜索。

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()
Run Code Online (Sandbox Code Playgroud)


jok*_*aut 7

试试这个新的正则表达式:(regex1)|(regex2)|(regex3)。这将匹配包含 3 个正则表达式中的任何一个的行。