我制作了这个正则表达式:
<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>
解析以下 RSS Feed :
<?xml version="1.0" encoding="UTF-8"?>\n<feed version="0.3" xmlns="http://purl.org/atom/ns#">\n<title>Gmail - Inbox for g.bargelli@gmail.com</title>\n<tagline>New messages in your Gmail Inbox</tagline>\n<fullcount>2</fullcount>\n<link rel="alternate" href="http://mail.google.com/mail" type="text/html" />\n<modified>2011-03-15T11:07:48Z</modified>\n<entry>\n<title>con due mail...</title>\n<summary>Gianluca Bargelli http://about.me/proudlygeek/bio</summary>\n<link rel="alternate" href="http://mail.google.com/mail?account_id=g.bargelli@gmail.com&message_id=12eb9332c2c1fa27&view=conv&extsrc=atom" type="text/html" />\n<modified>2011-03-15T11:07:42Z</modified>\n<issued>2011-03-15T11:07:42Z</issued>\n<id>tag:gmail.google.com,2004:1363345158434847271</id>\n<author>\n<name>me</name>\n<email>g.bargelli@gmail.com</email>\n</author>\n</entry>\n<entry>\n<title>test nuova mail</title>\n<summary>Gianluca Bargelli sono tornato!?& http://about.me/proudlygeek/bio</summary>\n<link rel="alternate" href="http://mail.google.com/mail?account_id=g.bargelli@gmail.com&message_id=12eb93140d9f7627&view=conv&extsrc=atom" type="text/html" />\n<modified>2011-03-15T11:05:36Z</modified>\n<issued>2011-03-15T11:05:36Z</issued>\n<id>tag:gmail.google.com,2004:1363345026546890279</id>\n<author>\n<name>me</name>\n<email>g.bargelli@gmail.com</email>\n</author>\n</entry>\n</feed>\n'skinner.com/products/spl].
问题是我没有使用 Python的模块获得任何匹配:
import re
regex = re.compile("""<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>""")
regex.findall(rss_string) # Returns an empty list
使用在线正则表达式测试器(例如this)按预期工作,所以我认为这不是正则表达式问题。
我很清楚 using regular expressions to parse a Context-Free Grammar is BAD ,但在我的情况下,正则表达式可能仅适用于 该RSS源(它是Gmail收件箱)顺便提一下,我知道我可以使用外部库/ xml解析器来执行此任务:它只是练习,而不是习惯。
问题应该是为什么以下正则表达式在Python中无法正常工作?
答案 0 :(得分:4)
您不应该使用正则表达式解析XML,而应该使用Universal Feed Parser来表示Python。在正则表达式上使用这个库将使您的生活更轻松,并且经过严格的战斗测试。
我个人多次使用过这个库,它就像一个魅力。
答案 1 :(得分:4)
在正则表达式编译器看到字符串之前,Python已经处理了斜杠转义符,因此您必须将其转义两次(例如\\\\n
为\\n
)。但是,Python对于这种事情有一个方便的表示法,只需在字符串前加上r
:
regex = re.compile(r"""<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>""")
顺便说一下,我同意这里的其他人,不要使用正则表达式来解析XML。但是,希望您会发现此字符串表示法在将来的正则表达式中有用。
答案 2 :(得分:2)
不要使用REGEX对XML / HTML进行分析!
使用以下其中一项:
享受!
编辑:哦,是的RSS。其他人说的话......我整个星期都会在这里。答案 3 :(得分:1)
不要试图重新发明轮子或玩智能RSS解析器的人。重用现有模块:http://www.feedparser.org/