Regex 首先捕获不同的组匹配
这是我的正则表达式,它有三个捕获组:Regex 首先捕获不同的组匹配,regex,Regex,这是我的正则表达式,它有三个捕获组: (.*)([0-9])([A-X]).* 但是,对于这两个字符串,我得到了不同的group1匹配: String1: ERICB7LTMC_01 1: [0,5] ERICB 2: [5,6] 7 3: [6,7] L OMXDIV7_6TS 1: [0,8] OMXDIV7_ 2: [8,9] 6 3: [9,10] T String2: ERICB7LTMC_01 1: [0,5] ERICB 2: [5,6] 7 3: [6,7] L OMXD
(.*)([0-9])([A-X]).*
但是,对于这两个字符串,我得到了不同的group1匹配:
String1:
ERICB7LTMC_01
1: [0,5] ERICB
2: [5,6] 7
3: [6,7] L
OMXDIV7_6TS
1: [0,8] OMXDIV7_
2: [8,9] 6
3: [9,10] T
String2:
ERICB7LTMC_01
1: [0,5] ERICB
2: [5,6] 7
3: [6,7] L
OMXDIV7_6TS
1: [0,8] OMXDIV7_
2: [8,9] 6
3: [9,10] T
我不知道为什么string2中的group1比赛不是OMXDIV。如果有人能解释这种匹配行为,我将不胜感激
此测试的regexplanet链接:
谢谢 这是因为您需要一个数字,后面跟一个字母,范围为
a-X
和([0-9])([a-X])
。由于\uu
(OMXDIV7\u6TS)不在A-X
范围内,第一个匹配是OMXDIV7\u
首先,让我们看看正则表达式规则的实际含义
你的正则表达式:(.*)([0-9])([A-X])。
说明:
(.*)
:
是一个通配符
元字符,它与除换行符以外的任何字符相匹配\n
。您使用了*
这是一种重复元字符匹配0
或many
通常称为贪婪
搜索([0-9])
:将匹配一个从0
到9
的数字([A-X])
:将匹配一个字符,范围从A
到X
*
:将匹配零个或多个字符(.*)
本身将匹配整个字符串。但随后正则表达式引擎开始从末尾开始回溯,并为group2查找匹配项。在这个过程中,它会回溯到
。
,因为这是组1中最后一个匹配的字符,,而在组2(([0-9])
)中找不到,因为组2只是数字。这就是为什么正则表达式引擎将
omxdiv76ts
作为整个字符串进行匹配。回溯时,它到达OMXDIV7
,并说“好的\u
也在组1中,但6
适合组2,因此我将在这里匹配组1。”
这对于理解整个搜索非常有用 正如@Thomas所述,您的
regex
正在查找一个数字([0-9])
,后跟任何[a\u X]
中的一个字符,因此7
(数字7
后跟一个特殊字符
)不是此处的匹配项
您可以使用下面的一个用于预期行为
([A-Z]*).*([0-9])([A-X]).*
即:
对于字符串-1:ERICB7LTMC_01
>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'ERICB7LTMC_01')
[('ERICB', '7', 'L')]
对于字符串-2:OMXDIV7_6TS
>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'OMXDIV7_6TS')
[('OMXDIV', '6', 'T')]
如果您需要获得第一个捕获组的最短匹配,那么您需要一个惰性匹配
(.*)
,并将
添加到a-X
范围:(.*)([0-9])([a-X]).*
确切的要求是什么?您的正则表达式有点像点星汤:它可以处理所有(.*)然后尝试满足您的其他要求:a-X中的一个数字和一个字符,以及其他所有内容(或者什么都没有)。对于第二个字符串,第一个表达式匹配所有内容,然后在返回时查找第一个数字(即6
),然后查找一个字符(即T
)-宾果,整体匹配成功,不再问任何问题。按照@WiktorStribiżew说的做(使用惰性量词),或者更具体一点。这对于理解整个搜索非常有用。这将是一个很好的评论,为什么重复regex101工作?相反,你可以投票给一个重复的“这个正则表达式是什么意思”。@WiktorStribiżew:我的意图不是复制正则表达式101的工作,但很明显,OP是正则表达式的新手,我解释了回溯的工作原理,并给出了一个指针,以了解更多关于这个过程的信息。