私がやりたいことは、2 つの連続する数字のインスタンスを文字列で検索することだけです。そのようなインスタンスが見つかった場合はそれをグループ化し、それ以外の場合はその特定のグループに対して何も返しません。これは些細なことだと思っていましたが、どこが間違っているのか理解できません。以下の例では、オプションの (?) 文字を削除すると数字が取得されますが、数字のない文字列では はr
None と評価されるため、r.groups() は例外をスローします。
p = re.compile(r'(\d{2})?')
r = p.search('wqddsel78ffgr')
print r.groups()
>>>(None, ) # why not ('78', )?
# --- update/clarification --- #
答えてくれてありがとう。これは、私が理解していないことを正確に特定するための別の方法です。
pattern = re.compile(r'z.*(A)?')
_string = "aazaa90aabcdefA"
result = pattern.search(_string)
result.group()
>>> zaa90aabcdefA
result.groups()
>>> (None, )
結果が得られる理由は理解できますresult.group()
が、なぜ結果が得られないのresult.groups()
です('A', )
か? 私はそれが次のように機能すると思いました: 正規表現が にヒットするz
と、.*
. すべてを照合するにもかかわらず.*
、正規表現エンジンはオプションのグループを通過したことを認識しており、可能な場合は?
照合を試みるため、逆方向に動作して照合を試みる必要があります。で置き換える?
と、+
return が返され('A', )
ます。?
これは、一致する必要がなければ一致しないことを示唆していますが、これは私がこの件に関して読んだ多くのもの (特に J. Friedl の優れた本) とは対照的であるように思われます。