0

Python 2.7.3 正規表現を使用して改行文字を含む大きな入力でいくつかの文字列を見つけようとしているときに問題が発生しました。私はこのようなものを持っています:

type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...

type="thing" のすべての ID を取得したい。貪欲な正規表現エンジンのため、次のような正規表現を作成する必要があります。

r'type="thing"(?!type).+id="[0-9]{6,7}"', re.S

ただし、これは機能しません。入力時にこの種のデータを使用して除外文字列正規表現を作成するにはどうすればよいですか?

4

2 に答える 2

0

(編集される前に)あなたの質問を正しく理解している場合は、IDに関連付けられている両方の行が必要です。その場合、これらの線に沿って何かが必要になります(新しい線が「\ n」でマークされていると仮定します)。

>>> import re
>>> t = """
type="thing" blahblahblah
something id="123456"
...
type="disabled thing" blahblahblah
somethingelse id="123457"
...
"""
>>> q = re.compile(r'type="thing".*\n.*\n')
>>> q.findall(t)
['type="thing" blahblahblah\nsomething id="123456"\n']
>>> for s in q.findall(t):
    print s  

type="thing" blahblahblah
something id="123456"

re.Sを使用しない場合は、表現の貪欲さをより効率的に制御できます。と組み合わせる.+re.S、表現が貪欲になります。それ以外の場合は、それを考慮する必要があります。のようなものを使用することもできます.+?。プラス記号の後の疑問符はあなたの表現を貪欲ではなくしますが、私はより簡潔な表現を選びます。

于 2013-01-16T13:38:32.003 に答える
0

これを使って:

r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S

例:

import re

s = b'''"type="thing" blahblahblah
something id="123456"
....
type="thing" blahblahblah
something id="123459"
....
type="disabled thing" blahblahblah
somethingelse id="123457"'''

expr = re.compile(r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S);

c = expr.findall(s)

for c1 in c:
    print ".."
    print c1

出力:

>>> 
..
123456
..
123459
于 2013-01-16T13:44:44.020 に答える