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

  • *
    :将匹配零个多个字符

  • 现在是你的问题

    文本:OMXDIV7

    由于group1正在搜索所有字符
    (.*)
    本身将匹配整个字符串。但随后正则表达式引擎开始从末尾开始回溯,并为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是正则表达式的新手,我解释了回溯的工作原理,并给出了一个指针,以了解更多关于这个过程的信息。