【问题标题】:Match a line with multiple regex using Python使用 Python 匹配具有多个正则表达式的行
【发布时间】:2012-02-11 21:35:00
【问题描述】:

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

【问题讨论】:

    标签: python regex


    【解决方案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')) 为例。
    【解决方案2】:
    #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.
    

    【讨论】:

    • 你应该在你的代码 sn-p 中包含一个解释
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • (?:...) 在这里可能比(...) 更好,以避免创建虚假的捕获组。
      • @Karl ...除非您想检查.group(n) 的真实性以确定您捕获了哪个组。
      • @Karl 你能详细说明你的评论吗?你所说的虚假组是什么意思?
      • 喜欢不需要的、无助于解决问题的组。我想我可能用错了这个词。但那也是 7 年前的事了。
      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      相关资源
      最近更新 更多