0

Pythonチャレンジに取り組んでいるときに、この問題に遭遇しました。正確には10番です。私は正規表現を使用してそれを解決しようと決心しました-繰り返しシーケンスを引き出し、それらの長さを数え、それからシーケンス内の次のアイテムを構築します。

したがって、私が開発した正規表現は次のとおりです。'(\d)\1*'

オンラインの正規表現テスターではうまく機能しましたが、スクリプトで使用すると同じようには機能しませんでした。

regex = re.compile('(\d)\1*')
text = '111122223333'
re.findall(regex, text)

> ['1', '1', '1', '1', '2', '2', '2',...]

などなど。そこで、Pythonのreモジュールでraw型について学びます。私の最初の質問はどれですか:誰かがこれが正確に何をするのか説明できますか?ドキュメントでは、バックスラッシュをエスケープする必要性を減らすと説明していますが、などのより単純な正規表現に必要なようには見えず、その\d+理由がわかりません。

そこで、正規表現をに変更し、シーケンスのリストを作成するためにr'(\d)\1*'使用してみます。findall()そして、私は得る

> ['1', '2', '3']

再び非常に混乱しました。私はまだこれを理解していません。助けてください?

私はこれを回避するためにこれを行うことにしました:

[m.group() for m in regex.finditer(text)]
> ['1111', '2222', '3333']

そして、私が探していたものを手に入れましょう。次に、このスレッドに基づいてfindall()、正規表現全体にグループを追加してみます-> r'((\d)\2*)'。私は最終的に:

> [('1111', '1'), ('2222', '2'), ('3333', '3')]

この時点で、私はあらゆる種類の混乱を招いています。この結果が複数のグループと関係があることは知っていますが、よくわかりません。

また、初めての投稿ですので、マナーがおかしいとお詫び申し上げます。それについてもお気軽に訂正してください。ありがとう!

4

1 に答える 1

1

これは挑戦なので、私はあなたに完全な答えを与えることはしません。しかし、あなたは正しい方向に進んでいます。

このfinditerメソッドはMatchObjectインスタンスを返します。.group()これらのメソッドを確認し、ドキュメントを注意深く読んでください。.group(0)そことの違いについて考えてください.group(1)。プレーン.group()はと同じ.group(0)です。

\dエスケープ文字については、その特定のエスケープの組み合わせは、Python文字列のエスケープ文字としては意味がないため、Pythonはそれを無視し、円記号と文字として残しますd。リテラル文字列形式を使用することをお勧めします。これは、Pythonが認識するエスケープシーケンスでもある正規表現の文字セットを使用r''たい場合に、厄介な驚きを防ぐためです。詳細については、文字列リテラルに関するPythonのドキュメントを参照してください

パターンに2つのグループが.findall()あるため、withr'((\d)\2*)'式は一致ごとに2つの要素を返します。外側のグループ全体のマッチング(\d)\2*と内側のグループのマッチング\d.findall()ドキュメントから:

パターンに1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。

于 2012-07-23T16:21:53.697 に答える