4

Python REを使用して、繰り返される線のパターンを一致させようとしています

入力文字列:

start_of_line: x
行 1
行 2
start_of_line: y
行 1
行 2
行 3
start_of_line: z
行 1

基本的に、ループ内で文字列を抽出したい (各文字列は start_of_line から次の start_of_line の前のすべての文字まで)

forループを使用してこれを簡単に解決できますが、これを行うためのpython REがあるかどうか疑問に思って、最善を尽くしましたが、グループ化部分に行き詰まりました。

私にとって解決策のように似ている最も近いものは

pattern= re.compile(r"start_of_line:.*?", re.DOTALL)
for match in re.findall(pattern, input_string):
    print "Match =", match

しかし、それは印刷します

Match = start_of_line:
Match = start_of_line:
Match = start_of_line:

グループ化するために何か他のことをすると、試合に負けます。

4

1 に答える 1

3

これを正規表現で行うには、先読みテストを使用する必要があります。

r"start_of_line:.*?(?=start_of_line|$)"

それ以外の場合は、遅延量指定子 ( *?) を使用するため、可能な限り短い一致が取得されます。start_of_line:

別の方法:

r"start_of_line:(?:[^\n]+|\n(?!start_of_line:))*"

\nここでは、 1 回以上繰り返される改行 ( ) 以外のすべてを含む文字クラスを使用します。start_of_line:正規表現エンジンが改行を見つけると、それに従っていないかどうかをテストします。グループを 0 回以上繰り返します。

このパターンは、改行が検出された場合にのみ先読みが実行されるため (各文字に対して)、最初のパターンよりも効率的です。

于 2013-06-26T21:10:37.157 に答える