[英]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.