首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python正则表达式: BackReference

Python正则表达式: BackReference
EN

Stack Overflow用户
提问于 2012-06-10 12:16:34
回答 2查看 3.7K关注 0票数 0

下面是Python2.5代码(它将单词fox替换为链接<a href="/fox">fox</a>,并避免了链接中的替换):

代码语言:javascript
复制
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 &quot;Dog chase Fox&quot; 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

产出如下:

代码语言:javascript
复制
[('', '', '', '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

我不知道为什么反向引用work.

  • (?!((<.*?)|(<a.*?)))(fox)(?!(([^<>]*?)>)|([^>]*?</a>))不会看到http://regexr.com?317bn,这是令人惊讶的。第一个负面展望(?!((<.*?)|(<a.*?)))令我困惑。在我看来,这是行不通的。以它找到的第一个匹配( fox )为例,在gave chase to the fox.</p>中,有一个匹配((<.*?)|(<a.*?))<a href='http://en.wikipedia.org/wiki/Dog'>dog</a>,作为一个负前瞻,它应该返回一个FALSE。我不确定我是否清楚地表达了自己。--

非常感谢!

(注:我讨厌使用BeautifulSoup。我喜欢写我自己的正则表达式。我知道这里很多人会说正则表达式不是HTML处理之类的。但是这是一个小程序,所以我更喜欢正则表达式而不是BeautifulSoup)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-10 12:41:46

我不知道为什么你的表情不管用,我只注意到一开始就有一个前瞻性小组,这对我来说没有多大意义。这个似乎很好用:

代码语言:javascript
复制
import re

content="""fox
    <a>fox</a> fox <p fox> and <tag fox bar> 
    <a>small <b>fox</b> and</a>
fox"""

rr = """
(fox)
(?! [^<>]*>)
(?!
    (.(?!<a))*
    </a
)
"""

p = re.compile(rr, re.IGNORECASE | re.MULTILINE | re.VERBOSE)
print p.sub(r'((\g<1>))', content)
票数 1
EN

Stack Overflow用户

发布于 2012-06-10 13:03:03

如果您不喜欢漂亮的汤,请尝试其他(X)HTML解析器之一:

代码语言:javascript
复制
html5lib
elementree
lxml

如果您曾经计划或需要解析HTML (或变体),那么值得学习这些工具。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10968617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档