2

正規表現は初めてです。文字列から繰り返し文字を削除する正規表現があります。

>>> self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
>>> self.repl = r'\1\2\3'

上記の2行のコードは、繰り返し文字を削除します。たとえば、looooooooveに移動しloveます。

ただし、繰り返し文字が3回以上繰り返された場合にのみ置換されるように、正規表現パターンを変更したいと思います。期待される出力:

cannot  ---> cannot
loooooooove ----> love

私は正規表現を理解していません。上記の正規表現が理解できる方法で解釈されているr'(\w*)(\w)\2(\w*)'r'\1\2\3' 役に立ちます。

4

1 に答える 1

7

正規表現がわかりません --> r'(\w*)(\w)\2(\w*)' および r'\1\2\3'わかりやすい方法。

では、行きましょう:

(\w*)任意の種類の単語文字(文字、数字、アンダースコア – ロケール設定によって異なります。アクセント付きのフランス語文字を含めることができます) で、ゼロ回または複数回 (量指定子 *を使用)。

次に、単語の 1 文字だけに一致させようとします(\w)。次に、同じ文字をもう一度使用\2ます\w

その後、最初と同じように、0 または複数の単語文字が続きます。

その式が一致する場合は、検索パターンで括弧を使用してサブパターンをキャプチャしself.repl = r'\1\2\3'て作成された一致に (再び後方参照を使用して) 置き換えます。

したがって、一致したすべての部分はそれ自体で置き換えられます – ただし、\2グループ化括弧を持たない繰り返しの文字 match は例外です。

したがって、繰り返し char を少なくとも 3 回発生させたい場合は、式のその部分を次のように変更します(\w)(\2{2,})'{2,}は、「前のパターンが少なくとも 2 回発生する場合にのみ一致する」という別の量指定子です。(最初の文字はすでに前の文字と一致しているため、少なくとも 2 回のみ。)(\w)

ただし、先頭と末尾を使用して機能させることはできませんでした(\w*)が、これらはゼロワード文字にも一致するため、完全に破棄できると思います.

したがって、これはあなたが達成したいことをするはずです:

self.repeat_regexp = re.compile(r'(\w)(\1{2,})')
self.repl = r'\1'

(ここでは先頭のキャプチャ サブパターンを削除したため、現在の最初のキャプチャ サブパターンを参照する\2に置き換えられました。)\1

于 2013-03-21T10:34:47.310 に答える