0

我正在尝试提取其中包含并匹配两个标签的 URL,这些标签具有关闭以及打开/未关闭的带有 href 的标签。

这就是正则表达式:

<(\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 应用程序中使用它时,最后两组(带标签的封闭文本和本身封闭的文本)总是None. 我怀疑它与具有反向引用的组中的组有关:((.+?))?

另外,我应该提到我专门使用:
    matcher = re.compile(...)
    matcher.findall(数据)

但是这些群体None同时出现在matcher.search(data)matcher.match(data)

任何帮助将不胜感激!

4

2 回答 2

1

恕我直言,你想做的很傻,你不应该做。

也就是说,它似乎对我有用(我的意思是给出非无结果):

>>> 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>)?')

你只需要放\\1r'...'像 DSM 一样

请注意,我对您的模式进行了微小的修改:有两个!
写作[\]而不是\[\]因为正则表达式机制很明显,[在第一个之后[是一个简单的字符
,对于(\)

请注意,我做了一组([\'"])并在最后放置(?:\\2)了相同的 内容

于 2013-02-12T00:39:59.710 回答