2012-01-17 39 views
7

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

回答

20

您可以使用内置函数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])如果正则表达式没有预编译regex对象,当然)

虽然将相比,你正则表达式中的单个表达式组合是ineficient - 如果这个代码是时间或cpu critical,则应尝试使用特殊的|正则表达式来分隔原始表达式,然后组合一个包含所有需求的正则表达式。 一个简单的方法将所有regexs结合是使用字符串“加入”运营商:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

虽然这种形式的结合正则表达式可能会导致错误的表现,如果原有的已经做使用的|运营商。

+2

如果将每个表达式包装在圆括号中,可以使联接方法不太可能失败。 '('+')|('。join(['foo','bar','baz'])+')''给出''(foo)|(bar)|(baz)''。 – FakeRainBrigand 2012-01-17 02:02:34

+3

更好的是,在'(?:...)'中换行,并将字符串放在一起,以突出其逻辑结构。例如,'''''.join('(?:{0})'.format(x)表示x('foo','bar','baz'))'。 – 2012-01-17 02:53:12

+0

为我工作....谢谢 – Prateek 2018-01-23 08:57:54

1

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

+1

'(?:...)'在这里可能比'(...)'更好,避免产生虚假的捕获组。 – 2012-01-17 02:52:56

+1

@Karl ...除非你想检查'.group(n)'的真实性,以确定你捕获了哪个*组。 – 2014-08-08 21:12:07

1

您可以通过正则表达式项目进行循环并执行搜索。

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()