2016-06-14 7 views
2

私はPython(3)を使用していますが、文字列の始めに一致する正規表現が必要です。可変長のため、RegEx look-behind '(?<= n | A)'が機能しません

複数の行を同時に処理する必要があるため、re.DOTALLフラグを追加する必要があります。ここの例は単純化されています。私が思い付いた何

はこの後読みです:

(?<=\n|\A)start of line 

私はそれをそれが動作on regex101.comをテストしたが、私はPython 3.5のコンソールでそれを実行すると、このエラートレースバックにつながる:

$ python3 
Python 3.5.1+ (default, Mar 30 2016, 22:46:26) 
[GCC 5.3.1 20160330] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> re.search(r'(?<=\n|\A)start of line', 'just any text to test', re.DOTALL) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.5/re.py", line 173, in search 
    return _compile(pattern, flags).search(string) 
    File "/usr/lib/python3.5/re.py", line 293, in _compile 
    p = sre_compile.compile(pattern, flags) 
    File "/usr/lib/python3.5/sre_compile.py", line 540, in compile 
    code = _code(p, flags) 
    File "/usr/lib/python3.5/sre_compile.py", line 525, in _code 
    _compile(code, p.data, flags) 
    File "/usr/lib/python3.5/sre_compile.py", line 158, in _compile 
    raise error("look-behind requires fixed-width pattern") 
sre_constants.error: look-behind requires fixed-width pattern 
>>> 

何代わりにこの制限を克服するために使用できますか?

+1

're.DOTALL'を使用しても、あなたは' re.MULTILINE'を使用できません。これでは '^ pattern'だけです。 –

+1

ただfyi。長さがゼロの '\ A'のためにlookbehindを使う必要はありません。 '(?<= \ n | \ A)'(https://regex101.com/r/zN5qN3/1)を '(?<= \ n | \ A)しかし、 '^'を使用した複数行の回答は適切です。 –

答えて

2

を、エラーメッセージが理にかなっています。

はあなたの正規表現で.を使用する場合は、この代わりに

re.search(r'^start of line', 'just any text to test', re.MULTILINE) 

DOTALLがのみ関連してください。

多分、regex101は、標準ライブラリのreではなく、サードパーティのregexパッケージを使用しています。

>>> import regex 
>>> regex.search(r'(?<=\n|\A)line', 'test\nline') 
<regex.Match object; span=(5, 9), match='line'> 

あなたが見ることができるように、可変幅の後読みのパターンを受け入れ正規表現。

+0

はい、私はこの例ではDOTALLは必要ないと知っていますが、実際のものはもっと複雑で、複数の行にまたがっています。しかし、MULTILINEフラグと '^'はパターンとして機能します。ありがとう。 –

+0

Regex101は 'regex' PyPiモジュールとは異なるものを使います。 Pythonオプションではバグです。 –

+0

regex101は、Pythonで利用できない機能を持つ正規表現が実行されないようにすることによって、PCREエンジンでPythonフレーバーを実装します。いくつかのコーナーケースを除いて、ほとんどのケースで機能します。 – nhahtdh

2

は、このようにちょうどあなたの正規表現を作り、それぞれごとにスタートし、行の終わりに一致するように^$の原因となる複数行フラグを使用します:\Aが文字ではないので

^ 
関連する問題