首先捕获组匹配不同

时间:2016-02-05 11:39:04

标签: regex

这是我的正则表达式,它有三个捕获组:

(.*)([0-9])([A-X]).*

但是我为这两个字符串获得了不同的group1匹配:

字符串1:

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

谢谢!

3 个答案:

答案 0 :(得分:0)

这是因为您需要一个数字后跟A-X范围内([0-9])([A-X])的字母。由于_(OMXDIV7 _ 6TS)不在A-X范围内,因此首次匹配为OMXDIV7_

答案 1 :(得分:0)

首先,让我们看看你的正则规则实际意味着什么。

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

<强>解释

  1. (.*).是一个 wildcard 元字符,与任何字符匹配,但换行符除外{{1 }}。您使用\n这是重复元字符匹配*0,通常称为many搜索。

  2. greedy:匹配一个数字,范围从([0-9])0

  3. 9:匹配一个字符,范围从([A-X])A

  4. X:匹配多个字符。

  5. 现在你的问题了。

    文字:OMXDIV7_6TS

    当group1正在搜索所有字符时,.*本身将匹配整个字符串(.*)。但随后正则表达式引擎从最后开始回溯并查找group2的匹配。

    在此过程中,它会回溯到OMXDIV7_6TS,因为它是group1中的最后一个字符拟合,而在group2(_)中找不到的只是数字的字符。

    这就是正则表达式引擎将([0-9])与整个字符串匹配的原因。虽然回溯达到OMXDIV7_6TS并且说&#34; 好的OMXDIV7_也在group1中,但_适用于group2,所以我将匹配group1直到此处。< / EM>&#34;

    Regex101 debugger非常适合理解整个搜索。

答案 2 :(得分:0)

正如@Thomas所述,您的regex正在寻找一个([0-9])号后跟[A_X]中的任意一个字符,所以7_(号码7后跟一个特殊字符_)不是匹配的条目......

您可以使用以下内容来表达预期的行为......

([A-Z]*).*([0-9])([A-X]).*

即:

对于String-1: ERICB7LTMC_01

>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'ERICB7LTMC_01')
[('ERICB', '7', 'L')]

对于String-2: OMXDIV7_6TS

>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'OMXDIV7_6TS')
[('OMXDIV', '6', 'T')]