与Perl&;相比,正则表达式模式在TCL中的表现有所不同;python
我正在尝试使用正则表达式从字符串中提取子字符串。下面是Python中的工作代码(给出所需的结果) Python解决方案与Perl&;相比,正则表达式模式在TCL中的表现有所不同;python,python,perl,tcl,tclsh,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/CA
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解决方案
$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/'
ABC_547_d
然而,当我尝试在Tcl
中使用这种方法时,它给了我不同的结果。有人能评论一下这种行为吗
% regexp -inline "CAR_.*?_(.*)" "CAR_2_ABC_547_d"
CAR_2_ {}
一个分支具有与其中第一个量化原子相同的偏好
哪个有偏好
因此,如果你将*
作为第一个量词,整个RE将是贪婪的,
如果你有*?
作为第一个量词,整个RE将是非贪婪的
由于您首先使用了*?
本身,因此进一步的表达式仅遵循惰性模式
如果添加行尾$
,则它将匹配整个行
% regexp -inline "CAR_.*?_(.*)$" "CAR_2_ABC_547_d"
CAR_2_ABC_547_d ABC_547_d
参考:另一种方法是删除前缀,而不是捕获前缀后面的文本:
$ echo "CAR_2_ABC_547_d" | perl -pe's/CAR_.*?_(.*)/$1/'
ABC_547_d
% set result [regsub {^CAR_.*?_} "CAR_2_ABC_547_d" {}]
ABC_547_d
我的要求是提取子字符串“ABC_547_d”。我故意使用
?
使其不贪婪。我只是想了解为什么它在Python中工作,而不是Tcl。这是关于Tcl
。由于第一个量词是非贪婪的,*
将只匹配空字符串。如果您使用了+
,那么它将单独为您提供字母A
。请您建议如何使用Tcl regex和分组方法来实现所需的结果。我可以看到原始的正则表达式在Perl和Python中工作。TCL处理正则表达式的方式不同吗?@sarbjit Python和TCL使用不同的正则表达式引擎。(Perl也是不同的,但是Python是通过复杂的途径从Perl派生而来的。)@Dinesh:这完全是胡说八道<代码>*?无法匹配空字符串,因为模式要求后跟下划线。