3

私がやりたいことは、2 つの連続する数字のインスタンスを文字列で検索することだけです。そのようなインスタンスが見つかった場合はそれをグループ化し、それ以外の場合はその特定のグループに対して何も返しません。これは些細なことだと思っていましたが、どこが間違っているのか理解できません。以下の例では、オプションの (?) 文字を削除すると数字が取得されますが、数字のない文字列では はrNone と評価されるため、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 の優れた本) とは対照的であるように思われます。

4

5 に答える 5

1

これは私のために働く:

p = re.compile('\D*(\d{2})?')
r = p.search('wqddsel78ffgr')
print r.groups()  # ('78',)

r = p.search('wqddselffgr')
print r.groups()  # (None,)
于 2012-11-07T13:30:00.897 に答える
0

正規表現パターンを使用する

(\d{2}|(?!.*\d{2}))

このデモを参照してください)

3桁以上ではなく、正確に2桁連続していることを確認したい場合は、

((?<!\d)\d{2}(?!\d)|(?!.*(?<!\d)\d{2}(?!\d)))

このデモを参照してください)

于 2012-11-07T13:15:24.370 に答える
0

?、正規表現を空の文字列と一致させます。省略した場合は、次のように結果を確認できます。

p = re.compile(r'(\d{2})')
r = p.search('wqddsel78ffgr')
print r.groups() if r else ('',)
于 2012-11-07T13:26:21.980 に答える
0

を使用して、文字列内の RE のすべての一致を簡単に検索できることを思い出してくださいfindall()

re.findall(r'\d{2}', 'wqddsel78ffgr') # => ['78']

試合が発生する位置が必要ない場合、これはあなたがしていることを達成するためのより簡単な方法のように思えます.

于 2012-11-07T13:55:33.700 に答える
-1

? - は 0 または 1 回の繰り返しです。したがって、正規表現プロセッサは最初に0回の繰り返しを見つけようとし、...見つけます:)

于 2012-11-07T13:27:01.093 に答える