0

Python 2.5 コードは次のとおりです (単語foxを link<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 &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

出力は次のとおりです。

[('', '', '', '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
  1. 後方参照が機能しない理由がわかりません\3

  2. (?!((<.*?)|(<a.*?)))(fox)(?!(([^<>]*?)>)|([^>]*?</a>))http://regexr.com?317bnを参照してください。これは驚くべきことです。最初の否定的な先読みは(?!((<.*?)|(<a.*?)))私を困惑させます。私の意見では、それは機能しないはずです。最初に見つかった一致を取得します。 にfoxgave chase to the fox.</p><a href='http://en.wikipedia.org/wiki/Dog'>dog</a>where と一致する場所があり((<.*?)|(<a.*?))、否定先読みとして FALSE を返す必要があります。私は自分自身を明確に表現しているかどうか確信が持てません。

どうもありがとう!

(注: BeautifulSoup を使うのは嫌いです。独自の正規表現を書くのが好きです。ここにいる多くの人が、正規表現は HTML 処理用ではないと言うでしょうが、これは小さなプログラムなので、BeautifulSoup よりも正規表現を好みます)

4

2 に答える 2

3

If you don't like beautifulsoup, try one of these other (X)HTML parsers:

html5lib
elementree
lxml

If you ever plan to, or need to, parse HTML (or variant) it is worth learning these tools.

于 2012-06-10T13:03:03.030 に答える
1

なぜあなたの表現がうまくいかないのかわかりません。私が気づいた唯一のことは、最初の先読みグループです。これはあまり意味がありません。これはうまくいくようです:

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)
于 2012-06-10T12:41:46.700 に答える