簡體   English   中英

獲取正則表達式的所有可能匹配項(在python中)?

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

  1. 查找從字符串索引i開始的第一個匹配項
  2. 再次對foo[i+1:]運行匹配功能
  3. 在字符串的剩余部分逐漸變短上重復步驟1和2。

如果您使用任意長度的捕獲組(例如(.*) ),它將變得更加棘手,因為您可能不希望同時使用foo-foobaroo-foobar作為匹配項,因此您必須進行一些額外的分析才能移動i甚至比每場比賽都+1 您需要將其移動到第一個捕獲組值的整個長度,再加上一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM