Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中组合多个正则表达式_Python_Regex - Fatal编程技术网

在Python中组合多个正则表达式

在Python中组合多个正则表达式,python,regex,Python,Regex,为了清楚起见,我正在寻找一种同时编译多个正则表达式的方法。 为了简单起见,假设每个表达式的格式都应该是(.*)something(.*)。 要测试的表达式不超过60个 如图所示,我最后写了以下内容 重新导入 re1=r'(.*)不是(.*) re2=r'(.*)与(.*)的大小相同 re3=r'(.*)是一个单词,而不是(.*)' re4=r'(*)是众所周知的,而不是(*)” 句子=[“foo2是一个词,不是bar2”] 对于句子中的句子: match=re.compile((%s |%s |

为了清楚起见,我正在寻找一种同时编译多个正则表达式的方法。 为了简单起见,假设每个表达式的格式都应该是
(.*)something(.*)
。 要测试的表达式不超过60个

如图所示,我最后写了以下内容

重新导入
re1=r'(.*)不是(.*)
re2=r'(.*)与(.*)的大小相同
re3=r'(.*)是一个单词,而不是(.*)'
re4=r'(*)是众所周知的,而不是(*)”
句子=[“foo2是一个词,不是bar2”]
对于句子中的句子:
match=re.compile((%s |%s |%s |%s)%)(re1,re2,re3,re4))。搜索(句子)
如果匹配项不是无:
打印(匹配组(1))
打印(匹配组(2))
打印(匹配组(3))
由于正则表达式由管道分隔,我认为一旦匹配了规则,它就会自动退出

执行代码时,我必须

foo2 is a word, not bar2
None
None
但是通过在re.compile
match=re.compile((%s |%s |%s |%s |%s)“%”(re3,re2,re1,re4)).search(句子)
,我已经

foo2 is a word, not bar2
foo2
bar2
据我所知,第一条规则被执行,而其他规则则没有。 有人能告诉我这个案子的正确方向吗


您好,

您的示例中存在各种问题:

  • 您使用的是一个捕获组,因此它会获取您希望引用第一组内部正则表达式的索引
    1
    。使用非捕获组
    (?:%s |%s |%s |%s)
  • 即使在
    |
    内部,组索引也会增加。所以
    (?:(a)|(b)|(c))
    你会得到:

    >>> re.match(r'(?:(a)|(b)|(c))', 'a').groups()
    ('a', None, None)
    >>> re.match(r'(?:(a)|(b)|(c))', 'b').groups()
    (None, 'b', None)
    >>> re.match(r'(?:(a)|(b)|(c))', 'c').groups()
    (None, None, 'c')
    
    似乎您希望只有一个组1返回
    a
    b
    c
    ,具体取决于分支。。。不,索引是按从左到右的顺序分配的,没有考虑正则表达式的语法

  • 模块可以根据您的需要对组进行编号。如果要使用内置模块,您必须接受这样一个事实,即如果使用命名组,正则表达式的不同分支之间的编号不相同:

    >>> import regex
    >>> regex.match(r'(?:(?P<x>a)|(?P<x>b)|(?P<x>c))', 'a').groups()
    ('a',)
    >>> regex.match(r'(?:(?P<x>a)|(?P<x>b)|(?P<x>c))', 'b').groups()
    ('b',)
    >>> regex.match(r'(?:(?P<x>a)|(?P<x>b)|(?P<x>c))', 'c').groups()
    ('c',)
    
    导入正则表达式 >>>regex.match(r'(?:(?Pa)|(?Pb)|(?Pc)),'a')。groups() (‘a’,) >>>regex.match(r'(?:(?Pa)|(?Pb)|(?Pc)),'b')。groups() (‘b’,) >>>regex.match(r'(?:(?Pa)|(?Pb)|(?Pc)),'c')。groups() (‘c’,)
    (尝试将该正则表达式与
    re
    一起使用会给重复的组带来错误)。

    Giacomo回答了这个问题。 但是,我也建议:1)将“编译”放在循环之前,2)在列表中收集非空组,3)考虑在re1、re2中使用(++)而不是(+*),等等

        rex= re.compile("%s|%s|%s|%s" % (re1, re2, re3, re4))
        for sentence in sentences:
            match = rex.search(sentence)
            if match:
                l=[ g for g in match.groups() if g!=None ]
                print(l[0],l[1])