>鉴于两个正则表达式的expr1和expr2,我们可以写一个正则表达式
它表示两个给定正则表达式的交集,在集合交集的意义上,它
正则表达式可用于匹配字符串中的任何位置?
例如,expr1是(123 | 12345 | abc | abcde),expr2是
(345 | 12345 | ABC | DE).我想找一个代表的正则表达式
(12345 | ABC).
因此,当将正则表达式应用于blah12345blahabcdeblah时,匹配
是12345和abc,而在应用正则表达式时
blah123blahabcblah,比赛是abc.
(?= ^ expr1 $)(?= ^ expr2 $).*有锚点^和$,阻止它在字符串中间找到匹配项.
>鉴于两个正则表达式的expr1和expr2,我们如何编写正则表达式
它代表了两个给定正则表达式的“交集”
感觉它由那些字符串组成,每个字符串
>出现在两个正则表达式中的至少一个中,并且
>在两个正则表达式的其余部分中有一个前缀,
正则表达式可用于匹配字符串中的任何位置?
例如,expr1是(123 | abcde),expr2是(12345 | abc).
我想找一个代表(12345 | abcde)的正则表达式.
因此,匹配
12345和abcde,同时应用正则表达式
blah123blahabcblah,没有比赛(123和abc不匹配).
在应用正则表达式匹配字符串中间时,第2部分中“交集”的定义比第1部分中的定义更自然:
在上面的例子中,每当12345匹配时,123也会出现,所以12345似乎在expr1和expr2中,并且应该在它们的“交集”中.如果123是匹配,则12345不一定是匹配,例如,在blah123blahabcblah中,因此在“交叉点”中不考虑123.对abcde的类似解释是和abc不在“交集”中.
谢谢!
解决方法
我还没有找到解决方案,会再看一下.
回答第2部分
这是一个适用于正则表达式引擎的解决方案,允许在后台进行反向引用,例如.NET和Matthew Barnett用于Python的优秀正则表达式模块.
对于你的例子:
(?x) (?=(12345|abc))(?=(123|abcde)) # AND the expressions (?: # take the longest match \1(?<=\2.*) #abcde,\1 is abc | \2(?<=\1.*) #12345,\2 is 123 )
一般来说:
(?x) (?=(expr1))(?=(expr2)) # AND the expressions (?: # take the longest match \1(?<=\2.*) | \2(?<=\1.*) )
我认为这有效……但也许有一个我没有想过的边缘情况.
这是一些经过测试的Python代码.
import regex pattern = r'''(?x) (?=(12345|abc))(?=(123|abcde)) # AND the expressions (?: # take the longest match \1(?<=\2.*) #abcde,\2 is 123 ) ''' myregex = regex.compile(pattern) print ("--- blah12345blahabcdeblah ---") for match in myregex.finditer("blah12345blahabcdeblah"): print("Overall match: ",match.group(0)) print ("--- blah123blahabcblah ---") for match in myregex.finditer("blah123blahabcblah"): print("Overall match: ",match.group(0)) print ("--- blah12345blahabcdeblah12345 ---") for match in myregex.finditer("blah12345blahabcdeblah12378"): print("Overall match: ",match.group(0))