加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何为两个正则表达式的“交集”编写正则表达式,可用于匹配字符

发布时间:2020-12-14 05:48:54 所属栏目:百科 来源:网络整理
导读:给定两个正则表达式,我们可以编写一个正则表达式来表示它们在以下两种差异感中的每一个中的“交集”,以便匹配字符串中的任何位置吗? 鉴于两个正则表达式的expr1和expr2,我们可以写一个正则表达式 它表示两个给定正则表达式的交集,在集合交集的意义上,它 正
给定两个正则表达式,我们可以编写一个正则表达式来表示它们在以下两种差异感中的每一个中的“交集”,以便匹配字符串中的任何位置吗?

>鉴于两个正则表达式的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不在“交集”中.

谢谢!

解决方法

第1部分

我还没有找到解决方案,会再看一下.

回答第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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读