5

正規表現について質問があります。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による回答を参照してください。

4

2 に答える 2

1

これは不可能だと思います。状態のドキュメントre.finditer

文字列内のREパターンの重複しないすべての一致に対してMatchObjectインスタンスを生成するイテレータを返します

強調は私のものです


空の文字列が他の場所で一致しない理由に関する他の質問への回答では、文字列の残りの部分がすでに他の場所で一致しており、一致する重複finditerしないパターンにのみ一致するためだと思います(最初の部分の回答を参照してください;- )。

于 2013-02-07T02:13:58.593 に答える
1

次のような式を使用して、Perlでそのようなことを実行できることを述べておきます。

(?:a|ab)(?{ say $& })(?!)

コンストラクトは(?{ code })、正規表現エンジンがパターン内のその位置に到達するたびにコードを実行します。ここでは、正規表現の直後に、これまでの試合の内容が印刷されます。その後(?!)、試合に失敗し、正規表現エンジンをバックトラックし、次の可能な試合を提供します。

これは、あらゆる種類の表現で機能します。

例:

perl -E "$_='ab'; /(?:a|ab)(?{ say $& })(?!)/"

出力:

a
ab

もう一つの例:

perl -E "$_='aaaa'; /a+(?{ say $& })(?!)/"

出力:

aaaa
aaa
aa
a
aaa
aa
a
aa
a
a
于 2013-02-07T03:16:00.867 に答える