当前位置:  开发笔记 > 编程语言 > 正文

是否有Perl相当于Python的re.findall/re.finditer(迭代正则表达式结果)?

如何解决《是否有Perl相当于Python的re.findall/re.finditer(迭代正则表达式结果)?》经验,为你挑选了2个好方法。

在Python中,编译的正则表达式模式有一个findall方法可以执行以下操作:

返回字符串中pattern的所有非重叠匹配,作为字符串列表.从左到右扫描字符串,并按找到的顺序返回匹配项.如果模式中存在一个或多个组,则返回组列表; 如果模式有多个组,这将是一个元组列表.结果中包含空匹配,除非它们触及另一个匹配的开头.

在Perl中执行此操作的规范方法是什么?我能想到的一个天真的算法是"当搜索并用空字符串替换成功时,做[套件]".我希望有一个更好的方式.:-)

提前致谢!



1> Chris Jester..:

/g在匹配中使用修饰符.从perlop手册:

" /g"修饰符指定全局模式匹配 - 即在字符串中尽可能多地匹配.它的行为取决于上下文.在列表上下文中,它返回正则表达式中任何捕获括号匹配的子字符串列表.如果没有括号,则返回所有匹配字符串的列表,就好像整个模式周围有圆括号一样.

在标量上下文中," m//g"的每次执行都会找到下一个匹配项,如果匹配则返回true,如果没有进一步匹配则返回false.可以使用该pos()功能读取或设置最后一次匹配后的位置; 见" pos" perlfunc.失败的匹配通常会将搜索位置重置为字符串的开头,但您可以通过添加" /c"修饰符(例如" m//gc")来避免这种情况.修改目标字符串也会重置搜索位置.



2> kyle..:

为了建立在Chris的响应上,将循环中的//g正则表达式包含在一个while循环中可能是最相关的,例如:

my @matches;
while ( 'foobarbaz' =~ m/([aeiou])/g )
{
    push @matches, $1;
}

粘贴一些快速的Python I/O:

>>> import re
>>> re.findall(r'([aeiou])([nrs])','I had a sandwich for lunch')
[('a', 'n'), ('o', 'r'), ('u', 'n')]

为了在Perl中获得类似的东西,构造可能是这样的:

my $matches = [];
while ( 'I had a sandwich for lunch' =~ m/([aeiou])([nrs])/g )
{
    push @$matches, [$1,$2];
}

但总的来说,无论你要迭代什么函数,你都可以在while循环内部进行.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有