使用正则表达式匹配html链接元素中的URL

时间:2013-02-12 00:05:57

标签: python regex

我正在尝试提取其中的网址,并匹配具有关闭以及包含hrefs的开放/未关闭的标记。

这就是正则表达式:

<(\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。我怀疑它与具有后引用的组中的组有关:((。+?))?

Also, I should mention that I specifically use:
    matcher = re.compile(...)
    matcher.findall(data)

Nonematcher.search(data)

中的matcher.match(data)群组均显示为{{1}}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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/', '', '')]

答案 1 :(得分:1)

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

您需要像DSM一样放置\\1r'...'

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

的情况相同

请注意,我做了一组([\'"])并将(?:\\2)放在最后抓住