[英]Get all possible matches for regex (in python)?
我有一个可以以多种可能的重叠方式匹配字符串的正则表达式。 但是,它似乎只能捕获字符串中的一个可能的匹配项,如何获得所有可能的匹配项? 我尝试过finditer并没有成功,但是也许我用错了。
我要解析的字符串是:
foo-foobar-foobaz
我正在使用的正则表达式是:
(.*)-(.*)
>>> s = "foo-foobar-foobaz"
>>> matches = re.finditer(r'(.*)-(.*)', s)
>>> [match.group(1) for match in matches]
['foo-foobar']
我想要匹配(foo和foobar-foobaz),但似乎只能得到(foo-foobar和foobaz)。
没问题:
>>> regex = "([^-]*-)(?=([^-]*))"
>>> for result in re.finditer(regex, "foo-foobar-foobaz"):
>>> print("".join(result.groups()))
foo-foobar
foobar-foobaz
通过将第二个捕获括号放入前瞻断言中 ,您可以捕获其内容,而无需在整体匹配中使用它。
我还用[^-]*
代替了.*
因为该点还与分隔符匹配-
您可能不希望这样。
正则表达式引擎往往无法做到这一点。 我不知道Python是否可以。 Perl可以使用以下内容:
local our @matches;
"foo-foobar-foobaz" =~ /
^(.*)-(.*)\z
(?{ push @matches, [ $1, $2 ] })
(*FAIL)
/xs;
使用以下技术,可以使用多种语言的正则表达式引擎来解决此特定问题:
my @matches;
while ("foo-foobar-foobaz" =~ /(?=-(.*)\z)/gsp) {
push @matches, [ ${^PREMATCH}, $1 ];
}
( ${^PREMATCH}
表示正则表达式匹配之前的内容, $1
表示第一个()
匹配的内容。)
但是您可以在正则表达式引擎之外轻松解决此特定问题:
my @parts = split(/-/, "foo-foobar-foobaz");
my @matches;
for (1..$#parts) {
push @matches, [
join('-', @parts[0..$_-1]),
join('-', @parts[$_..$#parts]),
];
}
很抱歉使用Perl语法,但应该可以理解。 欢迎翻译成Python。
如果要检测重叠的匹配项,则必须自己实现-本质上是对于字符串foo
i
开始的第一个匹配项 foo[i+1:]
运行匹配功能 如果您使用任意长度的捕获组(例如(.*)
),它将变得更加棘手,因为您可能不希望同时使用foo-foobar
和oo-foobar
作为匹配项,因此您必须进行一些额外的分析才能移动i
甚至比每场比赛都+1
; 您需要将其移动到第一个捕获组值的整个长度,再加上一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.