2

正規表現を使用して、ファイル内の 2 つの文字列の間のテキスト文字列を見つけて置き換えようとしています。私が抱えている問題は、「終了」文字列を見つけた後に「中断」したいのですが、代わりに最初の「開始」文字列と最後の「終了」文字列の間のすべてのテキストを置き換えます。

_copyright = 'BEGIN COPYRIGHT \n The replacing string \n END COPYRIGHT'

_file = re.sub(r'BEGIN COPYRIGHT[\w\s]*END COPYRIGHT',_copyright, _file)

著作権を取得する

フー

著作権の終了

著作権を取得する

バー

著作権の終了

したがって、foo と bar の両方が「置換文字列」になるはずですが、ドキュメントは次のようになります。

著作権を取得する

置換文字列

著作権の終了

4

1 に答える 1

5

少なくとも、スター量指定子を遅延させる必要があります。

_file = re.sub(r'BEGIN COPYRIGHT[\w\s]*?END COPYRIGHT',_copyright, _file)

それ以外の場合は、介在するシーケンス[\w\s]*を含め、できるだけ多くの文字に貪欲に一致します。END COPYRIGHT/BEGIN COPYRIGHT

別の、もう少し明示的な方法は、これを行うことです。

_file = re.sub(r'''(?x)BEGIN COPYRIGHT
                   (?:(?!(?:END|BEGIN) COPYRIGHT)[\w\s])*
                   END COPYRIGHT''',_copyright, _file)

後者のバージョンは、それが[\w\s]部分文字列の先頭にない場合にのみEND COPYRIGHT一致します。BEGIN COPYRIGHTしたがって、誰かがそのEND COPYRIGHT部分をそこに置くのを忘れたとしても、その境界を超えません。

于 2012-10-08T15:21:39.080 に答える