5

私は一連の作成者と一致するはずの小さなPythonスクリプトに取り組んでおり、そのためにre-moduleを使用しています。私は予期しない何かに遭遇し、それを次の非常に単純な例に減らすことができました。

>>> import re
>>> s = "$word1$, $word2$, $word3$, $word4$"
>>> word = r'\$(word\d)\$'
>>> m = re.match(word+'(?:, ' + word + r')*', s)
>>> m.groups()
('word1', 'word4')

したがって、入力の主要部分に一致する「基本的な」正規表現を定義し、いくつかの認識可能な機能(この場合は$-記号を使用)を使用して、1つの単語と可能な追加の単語リストを一致させようとします。

私はそれm.groups()が表示されると思っていたでしょう:

>>> m.groups()
('word1', 'word2', 'word3', 'word4')

しかし、どうやら私は何か間違ったことをしているようです。このソリューションが機能しない理由と、探している結果が得られるように変更する方法を知りたいです。ところで、これは、重要な場合に備えて、Linuxマシン上のPython2.6.6の場合です。

4

4 に答える 4

7

あなたは毎$word#$に一致していますが、2番目のキャプチャグループは最後に一致したアイテムに継続的に置き換えられています。

デバッガーを見てみましょう。

>>> expr = r"\$(word\d)\$(?:, \$(word\d)\$)*"
>>> c = re.compile(expr, re.DEBUG)
literal 36
subpattern 1
  literal 119
  literal 111
  literal 114
  literal 100
  in
    category category_digit
literal 36
max_repeat 0 65535
  subpattern None
    literal 44
    literal 32
    literal 36
    subpattern 2
      literal 119
      literal 111
      literal 114
      literal 100
      in
        category category_digit
    literal 36

ご覧のとおり、キャプチャ グループはsubpattern 1との 2 つだけsubpattern 2です。$word#$別のものが見つかるたびに、subpattern 2上書きされます。

潜在的な解決策については、次re.findall()の代わりに使用することをお勧めしre.match()ます。

>>> s = "$word1$, $word2$, $word3$, $word4$"
>>> authors = re.findall(r"\$(\w+)\$", s)
>>> authors
['word1', 'word2', 'word3', 'word4']
于 2012-06-11T08:28:43.967 に答える
4

正規表現にはキャプチャ グループが 2 つしかありません。re.findall(word, s)代わりに試してください。

繰り返しキャプチャはregexモジュールでサポートされています。

于 2012-06-11T08:23:45.827 に答える
1

次の場合のように、オプションのキャプチャ グループまたは繰り返しキャプチャ グループがある場合:

(?:, \$(word\d)\$)*

正規表現には、文字列の 3 つのセクションに一致したという事実にもかかわらず、そのグループでキャプチャされたテキストを返す場所が 1 つしかないため、最後のそのような部分文字列が含まれています。

すべての部分文字列を見つけるには、findall他の区切り文字で文字列を使用またはトークン化できます。

于 2012-06-11T08:26:35.237 に答える
0

次のように正規表現を回避できます。

>>> s = "$word1$, $word2$, $word3$, $word4$"
>>> s.replace('$','').split()
['word1,', 'word2,', 'word3,', 'word4']

findall()正規表現を使用すると、代わりに使用できます。

>>> re.findall(word, s)
['word1', 'word2', 'word3', 'word4']
于 2012-06-11T08:20:55.417 に答える