第一个捕获组匹配不同

问题描述:

这是我的正则表达式有三个捕捉组:第一个捕获组匹配不同

(.*)([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

谢谢!

+0

如果你需要得到最短的匹配到第一个捕获组,你需要一个懒惰匹配' '并将'_'添加到'AX'范围:'(。*?)([0-9])([A-X _])。*' –

+0

什么是确切的要求? –

+0

你的正则表达式是一种点星汤:它将所有东西(。*)进行匹配,然后试图满足你的其他要求:一个数字和一个来自A-X的字符和其他所有东西(或者什么都不)。对于第二个字符串,第一个表达式匹配所有内容,然后在返回时查找* first *数字(这是'6'),然后查找一个字符(这是'T') - 宾果,总体匹配成功了,没有进一步的问题。像@WiktorStribiżew所说的那样(使用一个懒惰的量词)或者更具体。 – Jan

这是因为您需要一个数字后跟A-X([0-9])([A-X])之间的一个字母。由于_(OMXDIV7 _ 6TS)不在范围A-X第一场比赛是OMXDIV7_

首先让我们看看你的正则表达式规则的实际含义。

您正则表达式(.*)([0-9])([A-X]).*

说明

  1. (.*).wildcard元字符相匹配任何换行符以外的\n。您已使用*这是一个重复元字符匹配0many通常被称为greedy搜索。

  2. ([0-9]):将匹配一个数字从09

  3. ([A-X]):将匹配一个字符从AX

  4. .*:将匹配许多字符。

现在你的问题。

文本:OMXDIV7_6TS

由于1组正在寻找一切字符(.*)本身将整个字符串匹配OMXDIV7_6TS。但是,然后正则表达式引擎从最后开始到回溯并查找group2的匹配。

在这个过程中它回溯至_,因为这是最后一个字符组1 配件,而不是在第2组(([0-9]))发现这仅仅是数字。

这就是为什么正则表达式匹配OMXDIV7_6TS作为整个字符串的原因。而回溯达到OMXDIV7_并说_也是1组,但6适合于第2组,所以我会匹配组1到这里。

Regex101 debugger是伟大的了解整个搜索。

+0

* [Regex101调试器](https://regex101.com/r/kA9pW2/1)非常适合理解整个搜索。*将是一个很好的评论,为什么重复regex101工作?相反,你可以投票选择“这个正则表达式意味着什么”。 –

+0

@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')]