我正在尝试提取其中的网址,并匹配具有关闭以及包含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)
但None
和matcher.search(data)
matcher.match(data)
群组均显示为{{1}}
非常感谢任何帮助!
答案 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一样放置\\1
或r'...'
请注意,我对您的模式进行了少量修改:
有两个!
写[\]
而不是\[\]
因为正则表达式机制很清楚[
在第一个[
之后是一个简单的字符
(\)
请注意,我做了一组([\'"])
并将(?:\\2)
放在最后抓住