5

このような正規表現があり、これの'^(a|ab|1|2)+$'すべてのシーケンスを取得したい...

たとえば、 re.search(reg, 'ab1') の場合、取得したい ('ab','1')

pattern で同等の結果が得られるが'^(a|ab|1|2)(a|ab|1|2)$'、(pattern)+ と一致したブロックの数がわからない

これは可能ですか?

4

3 に答える 3

4

これを試して:

import re
r = re.compile('(ab|a|1|2)')
for i in r.findall('ab1'):
    print i

オプションは最初になるように移動されているため、単に を優先してab一致します。findall メソッドは正規表現に何度も一致し、一致したグループのリストを返します。この単純な例では、文字列のリストだけが返されます。1 つの一致の各文字列。さらにグループがある場合は、各グループの文字列を含むタプルのリストが返されます。aba

これは2番目の例でうまくいくはずです:

pattern = '(7325189|7325|9087|087|18)'
str = '7325189087'
res = re.compile(pattern).findall(str)
print(pattern, str, res, [i for i in res])

^$findall が複数の部分文字列を検索する必要がある場合は、str 内の任意の場所を検索する必要があるため、パターンから記号を削除しています。+次に、パターン内のこれらのオプションの単一の出現に一致するように削除しました。

于 2013-08-04T17:30:40.957 に答える
3

元の式は希望どおりに一致します。文字列全体に一致するだけで、個別の一致ごとに個々のグループをキャプチャしません。繰り返し演算子 ('+'、'*'、'{m,n}') を使用すると、グループは毎回上書きされ、最終一致のみが保存されます。これはドキュメントでほのめかされています:

グループが複数回一致した場合、最後の一致のみにアクセスできます。

于 2013-08-04T21:15:51.097 に答える