这是我的正则表达式,它有三个捕获组:
(.*)([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
谢谢!
答案 0 :(得分:0)
这是因为您需要一个数字后跟A-X
范围内([0-9])([A-X])
的字母。由于_
(OMXDIV7 _ 6TS)不在A-X
范围内,因此首次匹配为OMXDIV7_
。
答案 1 :(得分:0)
首先,让我们看看你的正则规则实际意味着什么。
您的正则表达式:(.*)([0-9])([A-X]).*
<强>解释强>:
(.*)
:.
是一个 wildcard
元字符,与任何字符匹配,但换行符除外{{1 }}。您使用\n
这是重复元字符匹配*
或0
,通常称为many
搜索。
greedy
:匹配一个数字,范围从([0-9])
到0
。
9
:匹配一个字符,范围从([A-X])
到A
。
X
:匹配零或多个字符。
现在你的问题了。
文字: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')]