анализировать аннотированный файл - PullRequest
0 голосов
/ 02 ноября 2011

Я пытаюсь разобрать файл, который содержит аннотацию имен людей в форме

<name> James Gold 

</name> said to meet with <name> Mable Helen  </name> tomorrow night

Я пытаюсь сделать это с помощью регулярного выражения Python, но это не работает. Я использую

annotation = re.findall(' <name>(.*)</name>', lines)

Я хочу восстановить все записи в теге <name>, но эти теги могут находиться в разных строках. Я попытался объединить все строки и удалить символы новой строки, но безрезультатно. есть идеи?

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

Предполагая, что это просто аннотированный файл, а не XML-файл (используйте решение Acorn в этом случае), вам следует использовать несколько флагов re, чтобы пропустить новые строки и использовать . лучше:

>>> src = """<name> James Gold
... </name> said to meet with <name> Mable Helen  </name> tomorrow night"""
>>>
>>> [s.strip() for s in re.findall(r'<name>(.*?)</name>', src, re.DOTALL)]
['James Gold', 'Mable Helen']

Затем просто strip результатов, чтобы получить правильную строку, если она пропустила новую строку. Кроме того, в вашем регулярном выражении отсутствовал оператор ?: поэтому он потреблял все до последнего тега </name>.

3 голосов
/ 02 ноября 2011

Если вы анализируете контент в формате XML, вам не следует использовать регулярные выражения. Используйте такой синтаксический анализатор, как lxml.

import lxml.etree as et

xml="""
<root>
<name> James Gold

</name> said to meet with <name> Mable Helen </name> tomorrow night
</root>
"""

tree=et.fromstring(xml)

for name in tree.xpath("//name"):
    print name.text.strip()

Результат:

James Gold
Mable Helen
0 голосов
/ 02 ноября 2011

Я согласен с Acorn, вы должны использовать парсер XML.Если вы ДОЛЖНЫ использовать регулярное выражение (если это школьное задание или что-то еще), вы захотите использовать флаг re.S..оператор по умолчанию не соответствует символам перевода строки.re.S заставит его соответствовать новой строке.Но тогда ваша комбо. * Будет жадной и будет соответствовать больше, чем вы ищете, так что вам придется настроить свое выражение.

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