0

前方および後方の先読みを使用するこの正規表現があります。

import re
re.compile("<!inc\((?=.*?\)!>)|(?<=<!inc\(.*?)\)!>")

C#からPythonに移植しようとしていますが、エラーが発生し続けます

look-behind requires fixed-width pattern

意味を失うことなくPythonでこれを書き直すことは可能ですか?

アイデアはそれが次のようなものと一致することです

<!inc(C:\My Documents\file.jpg)!>

アップデート

ルックアラウンドを使用して、変更したHTTPマルチパートテキストを解析しています

body = r"""------abc
Content-Disposition: form-data; name="upfile"; filename="file.txt"
Content-Type: text/plain

<!inc(C:\Temp\file.txt)!>
------abc
Content-Disposition: form-data; name="upfile2"; filename="pic.png"
Content-Type: image/png

<!inc(C:\Temp\pic.png)!>
------abc
Content-Disposition: form-data; name="note"

this is a note
------abc--
"""

multiparts = re.compile(...).split(body)

分割を行うときにファイルパスとその他のテキストを取得するだけで、開始タグと終了タグを削除する必要はありません。

コードの簡潔さは重要です<!inc(が、正規表現が実行可能になる場合は、形式を変更することもできます。

4

3 に答える 3

4

ドキュメントから:

(?<!...)

文字列内の現在の位置の前に...の一致がない場合に一致します。これは、ネガティブルックビハインドアサーションと呼ばれます。ポジティブルックビハインドアサーションと同様に、含まれるパターンは、一定の長さの文字列にのみ一致する必要があります。ネガティブルックビハインドアサーションで始まるパターンは、検索対象の文字列の先頭で一致する場合があります。

(?<=...)

文字列内の現在の位置の前に、現在の位置で終了する...の一致がある場合に一致します。これは、ポジティブルックビハインドアサーションと呼ばれます。(?<= abc)defはabcdefで一致を検索します。これは、ルックビハインドが3文字をバックアップし、含まれているパターンが一致するかどうかを確認するためです。含まれるパターンは、一定の長さの文字列にのみ一致する必要があります。つまり、abcまたはa | bは許可されますが、a*およびa{3,4}は許可されません。ポジティブルックビハインドアサーションで始まるパターンは、検索対象の文字列の先頭では一致しないことに注意してください。ほとんどの場合、match()関数ではなくsearch()関数を使用することをお勧めします。

強調鉱山。いいえ、現在の形式でPythonに移植できるとは思いません。

于 2012-06-25T21:33:02.153 に答える
3

同じ配列内のパス+「すべて」の場合、開始タグと終了タグを分割するだけです。

import re
p = re.compile(r'''<!inc\(|\)!>''')
awesome = p.split(body)

終了タグに柔軟性があると言いますが)!>、コードの他の場所で発生する可能性がある場合は、その終了タグを次のようなもの)!/inc>(または一意である限りは何でも)に変更することを検討してください。

それが実行されるのを見てください。

于 2012-06-25T21:33:15.310 に答える
1
import re

pat = re.compile("\<\!inc\((.*?)\)\!\>")

f = pat.match(r"<!inc(C:\My Documents\file.jpg)!>").group(1)

結果はf == 'C:\My Documents\file.jpg'

Jon Clementsへの返信:

print re.escape("<!inc(filename)!>")

結果は

\<\!inc\(filename\)\!\>

結論:re.escape彼らは逃げるべきだと考えているようです。

于 2012-06-25T21:36:22.067 に答える