Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与Perl&;相比,正则表达式模式在TCL中的表现有所不同;python_Python_Perl_Tcl_Tclsh - Fatal编程技术网

与Perl&;相比,正则表达式模式在TCL中的表现有所不同;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

我正在尝试使用正则表达式从字符串中提取子字符串。下面是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解决方案

$ 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:这完全是胡说八道<代码>*?无法匹配空字符串,因为模式要求后跟下划线。