2

のすべてのURLに「php」を追加する必要がありhref="xxx"ます。これは「php」で終わらないものです。
私はネガティブな先読みを使用します(?!php)

find = r'href="(.+?)(?!php)"'
replace =  r'href="\1.php"'
re.sub(find, replace, 'href="url"')
re.sub(find, replace, 'href="url.php"')

両方とも拡張子を追加します:

href="url.php"
href="url.php.php"

なぜネガティブ先読みが機能しないのですか?

4

2 に答える 2

4

以下は機能します:

In [49]: re.sub(r'href="([^"]*?)([.]php)?"', r'href="\1.php"', 'href="url.php"')
Out[49]: 'href="url.php"'

In [50]: re.sub(r'href="([^"]*?)([.]php)?"', r'href="\1.php"', 'href="url"')
Out[50]: 'href="url.php"'

元の正規表現(.+?)(?!php)が完全に機能しない理由はurl.php、次のように一致するためです。

  • (.+?)一致するurl.php;
  • 次の文字は二重引用符であるため、この時点で負の先読みが満たされます。

つまり、.+?拡張子を含むファイル名全体を消費するため、先読みが不要になります。

于 2012-11-27T06:51:13.363 に答える
1

負の先読みとは、正規表現が次のパターンに一致しようとしますが、パターンを消費しないことを意味します。パターンは、と"(.+?)(?!php)"一致するまで1つ以上の任意の文字と一致"し、次に次のパターンである。と一致しようとしphpます。次の文字がであるため、この先読みは常に失敗します"。これは負の先読みであるため、パターン全体が成功します。

必要なのはネガティブルックビハインド((?<!PATTERN))で、キャラクターが消費された後にパターンを一致させようとします。が満たされると"、lookbehindpatternは最後の3文字をpatternと照合しようとしますphp

要するに、以下のパターンで再試行してください

find = 'href="(.+?)(?<!php)"'
于 2012-11-27T06:58:32.137 に答える