Python Regex работает не так, как ожидалось

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

<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]. 

Проблема в том, что я не получаю никаких совпадений, используя модуль Python re :

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

Использование онлайн-тестера регулярных выражений (например, это ) работает так, как ожидалось, поэтому я не думаю, что это проблема с регулярным выражением.

редактировать

Мне хорошо известно, что использование регулярных выражений для анализа грамматики без контекста – это BAD , но в моем случае регулярное выражение, скорее всего, будет работать только для этого RSS-канала (кстати, это почтовый ящик Gmail), и я знаю i может использовать внешний анализатор / XML-парсер для этой задачи: это всего лишь упражнение , а не привычка .

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

4 Solutions collect form web for “Python Regex работает не так, как ожидалось”

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

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

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

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

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

НЕ ПОВТОРИТЕ XML / HTML С REGEX!

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

  • BeautifulSoup
  • LXML
  • pyquery

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

EDIT: О да, это RSS. Что говорили другие люди … Я буду здесь всю неделю.

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

  • Python 3.1 RSS Parser?
  • Потребление RSS в Django (/ Python)
  • Как проверить, обновлен ли RSS-канал в Python?
  • lxml - анализ синтаксиса stackexchange rss feed
  • Разбор RSS с Elementtree в Python
  • советы по созданию RSS / XML легко в python
  • Ошибка кодирования при разборе RSS с помощью lxml
  • Проблема с потреблением котла в python
  • Python - лучший язык программирования в мире.