与Perl和Perl相比,TCL中的正则表达式表现不同。蟒蛇

时间:2016-09-06 10:18:01

标签: python perl tcl tclsh

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

Python解决方案

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

Perl解决方案

$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/'
ABC_547_d

TCL解决方案

然而,当我尝试在Tcl中使用这种方法时,它给了我不同的结果。有人可以对此行为发表评论

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

2 个答案:

答案 0 :(得分:4)

  

分支与其中的第一个量化原子具有相同的偏好   有偏好。

所以如果你有.*作为第一个量词,整个RE都会贪婪, 如果你有.*?作为第一个量词,整个RE将是非贪婪的。

由于您在第一个位置使用了.*?,因此进一步的表达式仅遵循延迟模式。

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

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

参考: re_syntax

答案 1 :(得分:1)

另一种方法是删除前缀:

,而不是捕获前缀后面的文本
% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d