在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.compilematch=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])