Python Regex не работает должным образом - PullRequest
1 голос
/ 16 марта 2011

Я создал это регулярное выражение :

<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>

для анализа следующего RSS-канала :

<?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&amp;message_id=12eb9332c2c1fa27&amp;view=conv&amp;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&amp;message_id=12eb93140d9f7627&amp;view=conv&amp;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].

Проблемая не получаю совпадений с помощью модуля re Python :

import re

regex = re.compile("""<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>""")
regex.findall(rss_string) # Returns an empty list

Использование онлайн-тестера регулярных выражений (такого как this ) работает, как ожидалосья не думаю, что это регулярное выражение1025 *, но в моем случае регулярное выражение, вероятно, будет работать только для этого канала RSS (кстати, это входящий канал Gmail), и я знаю, что могу использовать внешний анализатор библиотеки / xml дляэто задание: это всего лишь упражнение , а не привычка .

Вопрос должен быть Почему следующее регулярное выражение не работает должным образом вPython

Ответы [ 4 ]

4 голосов
/ 16 марта 2011

До того, как компилятор regex увидит строку, Python уже обработал косые черты, поэтому вам придется избегать ее дважды (например, \\\\n для \\n).Тем не менее, Python имеет удобную запись именно для такого рода вещей, просто вставьте r перед строкой:

regex = re.compile(r"""<entry>\\n<(\w+)>(.+?)</\w+>\\n</entry>""")

Кстати, я согласен с другими здесь, не используйте регулярные выражения для анализаXML.Однако, надеюсь, вы найдете эту строковую запись полезной в будущих регулярных выражениях.

4 голосов
/ 16 марта 2011

Вы не должны анализировать XML с регулярным выражением, вместо этого вы должны использовать Универсальный анализатор каналов для Python. Использование этой библиотеки вместо регулярных выражений сделает вашу жизнь проще и прошла боевые испытания на правильность.

Я лично использовал эту библиотеку много раз, она работает как шарм.

2 голосов
/ 16 марта 2011

НЕ РАЗДЕЛАТЬ XML / HTML С РЕГЕКСОМ!

Используйте одно из следующего:

Наслаждайтесь!

РЕДАКТИРОВАТЬ: Ах да, это RSS. Что говорили другие люди ... Я буду здесь всю неделю.

1 голос
/ 16 марта 2011

Не пытайтесь изобретать велосипеды или играть в умного парсера RSS.Повторное использование существующих модулей: http://www.feedparser.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...