2016-05-30 4 views
0

У меня есть текст (не является корректным XML документ) с некоторыми словами в тегах XML, как это:Python регулярное выражение для вложенных элементов XML

We have Potter the <term attrib="LINE:246">wizard</term> interacting with<term attrib="LINE:36080">witches</term> and <term attrib="LINE:360">goblins</term> talking about <term attrib="LINE:337"><term attrib="LINE:329"><term attrib="LINE:468">dark</term></term> <term attrib="LINE:375">arts</term></term> in regions to the east of Hogwarts. 

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

<term><term>something</term><term>else</term></term> 

Я использую Python, для моей работы, и я попытался следующий за мою работу:

re.findall(r'(<term.+?</term>)', textfile) 

Но я получаю что-то вроде этого:

<term><term>something</term> 

Это плохо, потому что мне не хватает остальных. Я также попробовал следующую жадную версию (что хуже):

re.findall(r'(<term.+</term>)' , textfile) 

Можете ли вы мне помочь?

+2

Вы можете найти http://stackoverflow.com/questions/37113364/regex-for-nested-xml-attributes информативный о проблемах, связанных с попыткой разобрать вложенный XML с регулярным выражением ... –

+0

ObZalgo: http: // stackoverflow.com/a/1732454/4014959 :) –

+0

Только модуль Pyge regex предлагает рекурсивное регулярное выражение. –

ответ

1

Вы используете неправильный инструмент для работы. Языки регулярных выражений не могут (обычно) подсчитываться, поэтому их использование для таких вещей будет крайне хрупким. Используйте подходящий XML-парсер с приятным интерфейсом, например BeautifulSoup. Это сэкономит вам время и даст лучшие результаты, которые будут менее хаки, чем когда-либо будет регулярное выражение.

См great docs примеры

-1

Может попробовать:

text = 'We have Potter the <term attrib="LINE:246">wizard</term> interacting with<term attrib="LINE:36080">witches</term> and <term attrib="LINE:360">goblins</term> talking about <term attrib="LINE:337"><term attrib="LINE:329"><term attrib="LINE:468">dark</term></term> <term attrib="LINE:375">arts</term></term> in regions to the east of Hogwarts.' 
text = re.sub("<.+?>", '', text) 
text = re.sub(" ", " ", text) 
print(text) 

Это должно вырезать каждый <tag> и </tag> есть, оставив все остальное нетронутым.

Конечно, это будет беспорядочно, если есть какие-либо знаки <, которые не являются частью тега XML.

Смежные вопросы