Regex模式在TCL中的行为与Perl和Python不同

2024-10-03 15:24:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用正则表达式从字符串中提取子字符串。下面是Python中的工作代码(给出所需的结果)

Python解决方案

x = r'CAR_2_ABC_547_d'
>>> spattern = re.compile("CAR_.*?_(.*)")
>>> spattern.search(x).group(1)
'ABC_547_d'
>>>

Perl解决方案

^{pr2}$

TCL解决方案

然而,当我试图在Tcl中使用这种方法时,它给了我不同的结果。有人能评论一下这种行为吗

% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d"
CAR_2_ {}

Tags: 方法字符串代码researchgroup解决方案car
2条回答

A branch has the same preference as the first quantified atom in it which has a preference.

所以如果你把.*作为第一个量词,整个RE会贪婪, 如果你把.*?作为第一个量词,那么整个RE将是非贪心的。在

由于您首先使用了.*?,所以后面的表达式只遵循lazy模式。在

如果您添加行尾$,那么它将匹配整个。在

% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d"
CAR_2_ABC_547_d ABC_547_d

参考:re_syntax

另一种方法不是捕获前缀后面的文本,而是只删除前缀:

% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d

相关问题 更多 >