2

我需要将“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)) 它将在字符被消耗后尝试匹配模式。当它遇到时",lookbehind pattern 尝试将最后 3 个字符与 pattern 匹配php

简而言之,请使用以下模式重试

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