2

可能な文字の範囲内で複数の同じ文字に連続して一致する RegEx が必要ですが、それらのパターン一致を 1 つのパターンとして返しません。これはどのように達成できますか?

明確にするために:

[ac] で始まり、貪欲に同じ文字の任意の数を返しますが、範囲内の他の文字は返さないパターンが必要です。シーケンス「aafaabbybcccc」では、次のパターンが見つかります。

('aa'、'aa'、'bb'、'b'、'cccc')

ただし、次のものは除外されます。

(「f」、「aabb」、「y」、「bcccc」)

パターンを見つける順序によって別の関数の出力が決まるため、複数の RegEx パターン検索を使用したくありません。この質問は、宿題ではなく、自己学習 (python) を目的としています。(私も担当者が 15 歳未満ですが、できるときに戻ってきて賛成票を投じます。)

4

2 に答える 2

2

良い質問。次のような正規表現を使用します。

(?P<L>[a-c])(?P=L)+

これはより堅牢です-acに限定されず、必要に応じてazに置き換えることができます。最初にac内の任意の文字をとして定義しL、次にその文字が1回以上出現するかどうかを確認します。re.findall()この正規表現を使用して実行します。

于 2012-05-23T03:02:09.913 に答える
1

\1 - \9後方参照を使用して、以前に一致した 1 番目から 9 番目のグループをキャプチャできます。

/([a-c])(\1+)/

[a-c]: Matches one of the character.
\1+  : Matches subsequent one or more previously matched character.

パール:

perl -e '@m = "ccccbbb" =~ /([a-c])(\1+)/; print $m[0], $m[1]'

cccc

パイソン:

>>> import re
>>> [m.group(0) for m in re.finditer(r"([a-c])\1+", 'aafaabbybcccc')]
['aa', 'aa', 'bb', 'cccc']
于 2012-05-23T03:07:58.540 に答える