这是 Python 2.5 代码(fox
用链接替换单词<a href="/fox">fox</a>
,它避免了链接内的替换):
import re
content="""
<div>
<p>The quick brown <a href='http://en.wikipedia.org/wiki/Fox'>fox</a> jumped over the lazy Dog</p>
<p>The <a href='http://en.wikipedia.org/wiki/Dog'>dog</a>, who was, in reality, not so lazy, gave chase to the fox.</p>
<p>See "Dog chase Fox" image for reference:</p>
<img src='dog_chasing_fox.jpg' title='Dog chasing fox'/>
</div>
"""
p=re.compile(r'(?!((<.*?)|(<a.*?)))(fox)(?!(([^<>]*?)>)|([^>]*?</a>))',re.IGNORECASE|re.MULTILINE)
print p.findall(content)
for match in p.finditer(content):
print match.groups()
output=p.sub(r'<a href="/fox">\3</a>',content)
print output
输出是:
[('', '', '', 'fox', '', '.', ''), ('', '', '', 'Fox', '', '', '')]
('', '', None, 'fox', '', '.', '')
('', '', None, 'Fox', None, None, None)
Traceback (most recent call last):
File "C:/example.py", line 18, in <module>
output=p.sub(r'<a href="fox">\3</a>',content)
File "C:\Python25\lib\re.py", line 274, in filter
return sre_parse.expand_template(template, match)
File "C:\Python25\lib\sre_parse.py", line 793, in expand_template
raise error, "unmatched group"
error: unmatched group
我不确定为什么反向引用
\3
不起作用。(?!((<.*?)|(<a.*?)))(fox)(?!(([^<>]*?)>)|([^>]*?</a>))
作品见http://regexr.com?3170 亿,令人惊讶。第一个负前瞻(?!((<.*?)|(<a.*?)))
让我感到困惑。在我看来,它不应该工作。取它找到的第一个匹配项,fox
在 中gave chase to the fox.</p>
,有一个<a href='http://en.wikipedia.org/wiki/Dog'>dog</a>
where 匹配项((<.*?)|(<a.*?))
,作为否定的前瞻,它应该返回一个 FALSE。我不确定我是否清楚地表达了自己。
非常感谢!
(注:我讨厌使用 BeautifulSoup。我喜欢编写自己的正则表达式。我知道这里很多人会说正则表达式不适用于 HTML 处理等等。但这是一个小程序,所以我更喜欢正则表达式而不是 BeautifulSoup)