применение регулярных выражений к XML-файлу в Python - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть назначение на Python, где я должен применить операции регулярного выражения к XML-файлу.Чтобы быть конкретным, я должен извлечь определенные разделы в файл XML. Например,

<?xml version="1.0" encoding="UTF-8"?>

<.... some xml sections...>

<keyword:ROW field1="value1">
<field2>=value2</field3>
<field3>=value3</field3>
</keyword:ROW>

<keyword:ROW field4="value4">
<field4>=value4</field4>
<field4>=value4</field4>
</keyword:ROW>

В приведенном выше примере кода я должен извлечь разделы, начинающиеся с

<keyword:ROW" 

Пожалуйста, скажите мнекак применить re.compile () к этой постановке проблемы.

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Почему бы вам не попробовать модуль xml?

Например.

import xml.etree.ElementTree as ET
tree = ET.parse('example.xml')
root = tree.getroot()

for item in root.findall('keyword:ROW'):
    field2 = country.find('field2').text
    print field2

См .: https://docs.python.org/2/library/xml.etree.elementtree.html

0 голосов
/ 07 декабря 2018

Синтаксический анализ XML с использованием регулярных выражений не является хорошей идеей, поскольку данные XML могут содержать вложенные структуры, приводящие к неожиданным результатам при синтаксическом анализе с использованием регулярных выражений.

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

(?s)<keyword:ROW.*?<\/keyword:ROW>

Чтобы найти все вхождения вашего тега <keyword:ROW

Объяснение:

  • (?s) -> Включает.чтобы соответствовать символам новой строки, которые не по умолчанию
  • <keyword:ROW -> Соответствует вашему намеченному ключевому слову
  • .*? -> Соответствует любому символу после этого без жадности и останавливается непосредственно перед <\/keyword:ROW>
  • <\/keyword:ROW> -> Соответствует конечному тегу и прекращает захват текста

Вот необходимый вам код Python,

import re
s = """
<?xml version="1.0" encoding="UTF-8"?>

<.... some xml sections...>

<keyword:ROW field1="value1">
<field2>=value2</field3>
<field3>=value3</field3>
</keyword:ROW>

<keyword:ROW field4="value4">
<field4>=value4</field4>
<field4>=value4</field4>
</keyword:ROW>
"""

arr = re.findall(r'(?s)<keyword:ROW.*?<\/keyword:ROW>', s)
print(arr)

Какойдает следующий вывод, который в основном состоит из двух ваших тегов, присутствующих в вашем образце xml.

['<keyword:ROW field1="value1">\n<field2>=value2</field3>\n<field3>=value3</field3>\n</keyword:ROW>', '<keyword:ROW field4="value4">\n<field4>=value4</field4>\n<field4>=value4</field4>\n</keyword:ROW>']

Дайте мне знать, если вам нужно что-нибудь объяснить здесь.

0 голосов
/ 07 декабря 2018

Вы можете попробовать это

<keyword:ROW\s[\w\W]*?<\/keyword:ROW>

Объяснение

  • <keyword:ROW - Совпадения <keyword:ROW.
  • \s - соответствует пробелу.
  • [\w\W]*? - соответствует любому символу ноль или более раз. (? Сделать его ленивым)
  • <\/keyword:ROW> - соответствует </keyword:ROW>

Демо

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