0

閉じたタグと、href を含む開いた/閉じていないタグの両方に一致する URL を抽出しようとしています。

つまり、正規表現は次のとおりです。

<(\w+)\s[^<>]*?href=[\'"]([\w$-_.+!*\'\(\),%\/:#=?~\[\]!&@;]*?)[\'"].*?>((.+?)</\1>)?

サンプルデータは次のとおりです。

<link href='http://blah.net/message/new/?stopemails.aspx?id=5A42FDF5' /><table><tr><td>
<a href='http://blah.net/message/new/'>Click here and submit your updated information </a> <br><br>Thanking you in advance for your attention to this matter.<br><br>

Regards, <br>
Debbi Hamilton
</td></tr><tr><td><br><br></td></tr></table>

そして、これをhttp://re-try.appspot.com/またはhttp://www.regexplanet.com/advanced/java/index.html (はい、Java 用であることはわかっています) に入れると、取得しようとしているものが正確に得られます。 : タグ、href テキスト、終了タグで囲まれたテキスト、および囲まれたテキスト自体。

つまり、これを Python アプリで使用すると、最後の 2 つのグループ (タグ付きで囲まれたテキスト、およびテキスト自体で囲まれた) は常にNone. 後方参照を持つグループ内のグループと関係があると思われます: ((.+?))?

また、私は特に以下を使用していることに言及する必要があります。
    matcher = re.compile(...)
    matcher.findall(データ)

ただし、グループはNoneと の両方に表示さmatcher.search(data)れます。matcher.match(data)

どんな助けでも大歓迎です!

4

2 に答える 2

1

敬意を表して、あなたがしたいことは非常にばかげているので、あなたはそれをすべきではありません。

そうは言っても、それは私にとってはうまくいくようです(つまり、None以外の結果が得られます):

>>> reg = r'<(\w+)\s[^<>]*?href=[\'"]([\w$-_.+!*\'\(\),%\/:#=?~\[\]!&@;]*?)[\'"].*?>((.+?)</\1>)?'
... 
>>> d = """
<link href='http://blah.net/message/new/?stopemails.aspx?id=5A42FDF5' /><table><tr><td>
<a href='http://blah.net/message/new/'>Click here and submit your updated information </a> <br><br>Thanking you in advance for your attention to this matter.<br><br>
Regards, <br>
Debbi Hamilton
</td></tr><tr><td><br><br></td></tr></table>
"""
>>> 
>>> re.findall(reg, d)
[('link', 'http://blah.net/message/new/?stopemails.aspx?id=5A42FDF5', '', ''), 
('a', 'http://blah.net/message/new/', 'Click here and submit your updated information </a>', 'Click here and submit your updated information ')]

私の推測では、正規表現を作成するときに生の文字列を使用するのを忘れたと思います。

>>> reg = '<(\w+)\s[^<>]*?href=[\'"]([\w$-_.+!*\'\(\),%\/:#=?~\[\]!&@;]*?)[\'"].*?>((.+?)</\1>)?'
... 
>>> re.findall(reg, d)
[('link', 'http://blah.net/message/new/?stopemails.aspx?id=5A42FDF5', '', ''), 
('a', 'http://blah.net/message/new/', '', '')]
于 2013-02-12T00:15:55.060 に答える
1
pat = ('<'
       '(\w+)\s[^<>]*?'
       'href='
       '([\'"])'
       '([\w$-_.+!*\'(\),%/:#=?~[\]!&@;]*?)'
       '(?:\\2)'
       '.*?'
       '>'
       '((.+?)</\\1>)?')

あなたはちょうど置く必要がありました\\1またはr'...'DSMがしたように

私はあなたのパターンにマイナーな変更を加えたことに注意してください: 代わりに2つの書き込みがあり!
ました .[\]\[\][[
(\)

最後に同じものをキャッチするために グループ化([\'"])して配置したことに注意してください(?:\\2)

于 2013-02-12T00:39:59.710 に答える