Regex perl正则表达式中的子类何时停止
我试图将一些perl代码翻译成python,但我遇到了一个特定的正则表达式的问题,我就是不知道它是做什么的,或者为什么它会停止 这是正则表达式Regex perl正则表达式中的子类何时停止,regex,python-2.7,perl,Regex,Python 2.7,Perl,我试图将一些perl代码翻译成python,但我遇到了一个特定的正则表达式的问题,我就是不知道它是做什么的,或者为什么它会停止 这是正则表达式 $url =~ s/^.*\///; 现在我试着传递一些URL,看看结果如何 这就是结果 # string input "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS" # string output "test.cgi?u=USER&p=PASS" 据我所知,我真的不
$url =~ s/^.*\///;
现在我试着传递一些URL,看看结果如何
这就是结果
# string input
"http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
# string output
"test.cgi?u=USER&p=PASS"
据我所知,我真的不知道为什么它会停在test
上,
它用零替换字符串开头的任何字符
那么为什么它会在测试时停止呢
如果你能帮我用python写一个正则表达式做同样的事情
那太酷了
提前谢谢
我真的不知道为什么它会在“test”处停止,据我所知,它会用零替换字符串开头的任何字符,所以为什么它会在test处停止
因为\/
是模式的一部分
# V here
$url =~ s/^.*\///;
如果代码使用了不同的引号分隔符(在Perl中是可能的),则会更清楚。那样的话,这里就不会有危险了
请注意,默认情况下它是贪婪的,因此它将吞噬所有的斜杠,直到最后一个斜杠
您可以在调试模式下使用来了解更多关于regex引擎在引擎罩下的功能
use re 'debug';
my $url = "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS";
$url =~ s{^.*/}{};
这将输出到STDERR
Compiling REx "^.*/"
Final program:
1: SBOL /^/ (2)
2: STAR (4)
3: REG_ANY (0)
4: EXACT </> (6)
6: END (0)
floating "/" at 0..9223372036854775807 (checking floating) anchored(SBOL) minlen 1
Matching REx "^.*/" against "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
Intuit: trying to determine minimum start position...
doing 'check' fbm scan, [0..54] gave 5
Found floating substr "/" at offset 5 (rx_origin now 0)...
(multiline anchor test skipped)
Intuit: Successfully guessed: match at offset 0
0 <> <http://per> | 0| 1:SBOL /^/(2)
0 <> <http://per> | 0| 2:STAR(4)
| 0| REG_ANY can match 54 times out of 2147483647...
31 <org/c> </test.cgi?> | 1| 4:EXACT </>(6)
32 <rg/c/> <test.cgi?u> | 1| 6:END(0)
Match successful!
Freeing REx: "^.*/"
编译REx“^.*/”
最终课程:
1:SBOL/^/(2)
2:星(4)
3:REG_ANY(0)
4:精确(6)
6:完(0)
在0..9223372036854775807(检查浮动)处浮动“/”锚定(SBOL)最小1
匹配REx“^.*/”与”http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
Intuit:正在尝试确定最小起始位置。。。
正在进行“检查”fbm扫描,[0..54]给出5
在偏移量5(rx_原点现在为0)处发现浮动子字符串“/”。。。
(跳过多线锚测试)
Intuit:已成功猜测:偏移量0处的匹配
0 | 0 | 1:SBOL/^/(2)
0 | 0 | 2:星(4)
|0 | REG| u任何人都可以匹配2147483647中的54次。。。
31 | 1 | 4:准确(6)
32 | 1 | 6:结束(0)
比赛成功!
释放REx:“^.*/”
我真的不知道为什么它会在“test”处停止,据我所知,它会用零替换字符串开头的任何字符,所以为什么它会在test处停止
因为\/
是模式的一部分
# V here
$url =~ s/^.*\///;
如果代码使用了不同的引号分隔符(在Perl中是可能的),则会更清楚。那样的话,这里就不会有危险了
请注意,默认情况下它是贪婪的,因此它将吞噬所有的斜杠,直到最后一个斜杠
您可以在调试模式下使用来了解更多关于regex引擎在引擎罩下的功能
use re 'debug';
my $url = "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS";
$url =~ s{^.*/}{};
这将输出到STDERR
Compiling REx "^.*/"
Final program:
1: SBOL /^/ (2)
2: STAR (4)
3: REG_ANY (0)
4: EXACT </> (6)
6: END (0)
floating "/" at 0..9223372036854775807 (checking floating) anchored(SBOL) minlen 1
Matching REx "^.*/" against "http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
Intuit: trying to determine minimum start position...
doing 'check' fbm scan, [0..54] gave 5
Found floating substr "/" at offset 5 (rx_origin now 0)...
(multiline anchor test skipped)
Intuit: Successfully guessed: match at offset 0
0 <> <http://per> | 0| 1:SBOL /^/(2)
0 <> <http://per> | 0| 2:STAR(4)
| 0| REG_ANY can match 54 times out of 2147483647...
31 <org/c> </test.cgi?> | 1| 4:EXACT </>(6)
32 <rg/c/> <test.cgi?u> | 1| 6:END(0)
Match successful!
Freeing REx: "^.*/"
编译REx“^.*/”
最终课程:
1:SBOL/^/(2)
2:星(4)
3:REG_ANY(0)
4:精确(6)
6:完(0)
在0..9223372036854775807(检查浮动)处浮动“/”锚定(SBOL)最小1
匹配REx“^.*/”与”http://perltest.my-mobile.org/c/test.cgi?u=USER&p=PASS"
Intuit:正在尝试确定最小起始位置。。。
正在进行“检查”fbm扫描,[0..54]给出5
在偏移量5(rx_原点现在为0)处发现浮动子字符串“/”。。。
(跳过多线锚测试)
Intuit:已成功猜测:偏移量0处的匹配
0 | 0 | 1:SBOL/^/(2)
0 | 0 | 2:星(4)
|0 | REG| u任何人都可以匹配2147483647中的54次。。。
31 | 1 | 4:准确(6)
32 | 1 | 6:结束(0)
比赛成功!
释放REx:“^.*/”
它在最后一个/
处停止。它在最后一个/
处停止。我正在尝试将一些perl代码翻译成python。。。如果你能帮我用python编写一个正则表达式,它可以做同样的事情,这会很酷-OP不需要Perl解决方案。实际上,这是一个代码转换请求。@WiktorStribiżew,我不会给出一个。他们没有问如何翻译。他们问它为什么这么做。我正在详细解释。当OP在您引用的最后一个请求中编辑时,我已经写完了我的答案。。。如果你能帮我用python编写一个正则表达式,它可以做同样的事情,这会很酷-OP不需要Perl解决方案。实际上,这是一个代码转换请求。@WiktorStribiżew,我不会给出一个。他们没有问如何翻译。他们问它为什么这么做。我正在详细解释。我已经写完了我的答案,当OP在你引用的最后一个请求中编辑时。