正規表現について質問があります。or
コンストラクトを使用する場合
$ python
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> for mo in re.finditer('a|ab', 'ab'):
... print mo.start(0), mo.end(0)
...
0 1
受け入れられた最初の左端のブランチとして期待される1つの一致のみが報告されます。私の質問は、それが可能であり、(0,1)と(0,2)の両方を生成する正規表現を構築する方法です。また、フォーム内の正規表現に対して一般的にそれを行う方法r1 | r2 | ... | rn
。
同様に、、、およびコンストラクトに対してこれを実現することは可能*
です+
か?
?デフォルトの場合:
>>> for mo in re.finditer('a*', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 3
3 3
>>> for mo in re.finditer('a+', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 3
>>> for mo in re.finditer('a?', 'aaa'):
... print mo.start(0), mo.end(0)
...
0 1
1 2
2 3
3 3
2番目の質問は、空の文字列が最後で一致するのに、*
andの場合のように他の場所では一致しないのはなぜかということ?
です。
編集:
@mgilsonが言ったように、re.finditerは重複しない一致のみを返し、正規表現が文字列(の一部)を受け入れるたびに検索を終了すると思います。したがって、Pythonマッチングエンジンのデフォルト設定では不可能です。
Pythonが正規表現マッチングでバックトラッキングを使用している場合、文字列を受け入れた後も検索を続行することはそれほど難しくないはずです。しかし、これは正規表現の通常の動作を壊します。
EDIT2:
これはPerlで可能です。以下の@Qtaxによる回答を参照してください。