第一个捕获组匹配不同
这是我的正则表达式有三个捕捉组:第一个捕获组匹配不同
(.*)([0-9])([A-X]).*
但是我得到不同组别的比赛对于这两个字符串:
的String1:
ERICB7LTMC_01
1: [0,5] ERICB
2: [5,6] 7
3: [6,7] L
String2:
OMXDIV7_6TS
1: [0,8] OMXDIV7_
2: [8,9] 6
3: [9,10] T
我不确定为什么在string2中的group1匹配不是OMXDIV。如果有人能够解释这种匹配行为,我会非常感激。
的regexplanet链接,这个测试:http://fiddle.re/vqayb6
谢谢!
这是因为您需要一个数字后跟A-X
与([0-9])([A-X])
之间的一个字母。由于_
(OMXDIV7 _ 6TS)不在范围A-X
第一场比赛是OMXDIV7_
。
首先让我们看看你的正则表达式规则的实际含义。
您正则表达式:(.*)([0-9])([A-X]).*
说明:
(.*)
:.
是wildcard
元字符相匹配任何换行符以外的\n
。您已使用*
这是一个重复元字符匹配0
或many
通常被称为greedy
搜索。([0-9])
:将匹配一个数字从0
到9
。([A-X])
:将匹配一个字符从A
到X
。.*
:将匹配零或许多字符。
现在你的问题。
文本:OMXDIV7_6TS
由于1组正在寻找一切字符,(.*)
本身将整个字符串匹配OMXDIV7_6TS
。但是,然后正则表达式引擎从最后开始到回溯并查找group2的匹配。
在这个过程中它回溯至_
,因为这是最后一个字符组1 配件,而不是在第2组(([0-9])
)发现这仅仅是数字。
这就是为什么正则表达式匹配OMXDIV7_6TS
作为整个字符串的原因。而回溯达到OMXDIV7_
并说“好_
也是1组,但6
适合于第2组,所以我会匹配组1到这里。”
Regex101 debugger是伟大的了解整个搜索。
* [Regex101调试器](https://regex101.com/r/kA9pW2/1)非常适合理解整个搜索。*将是一个很好的评论,为什么重复regex101工作?相反,你可以投票选择“这个正则表达式意味着什么”。 –
@WiktorStribiżew:我的目的不是复制regex101的工作,但显然OP是一个正则表达式的新手,我解释了回溯如何工作,并给出了一个指针,以更多地了解这个过程。 – 2016-02-05 13:13:26
由于@Thomas解决后,您regex
正在寻找一些([0-9])
随后以任何的[A_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')]
如果你需要得到最短的匹配到第一个捕获组,你需要一个懒惰匹配' '并将'_'添加到'AX'范围:'(。*?)([0-9])([A-X _])。*' –
什么是确切的要求? –
你的正则表达式是一种点星汤:它将所有东西(。*)进行匹配,然后试图满足你的其他要求:一个数字和一个来自A-X的字符和其他所有东西(或者什么都不)。对于第二个字符串,第一个表达式匹配所有内容,然后在返回时查找* first *数字(这是'6'),然后查找一个字符(这是'T') - 宾果,总体匹配成功了,没有进一步的问题。像@WiktorStribiżew所说的那样(使用一个懒惰的量词)或者更具体。 – Jan