XML лучше анализировать, используя библиотеку типа Beautiful Soup вместо регулярных выражений.Я могу дать вам идеальное решение для регулярных выражений, но я обязательно привлечу к нему отрицательные отзывы:)
Я бы посоветовал вам перейти по ссылке и ознакомиться с ней, чтобы вы не выбирали регулярные выражения, когда вам нужнодля анализа HTML / XML / Json.
Кроме того, ваш XML немного искажен, так как /
отсутствует в некоторых ваших тегах полей, которые я исправил.
Вам понадобится несколькоэтот вид кода Python для анализа XML и агрегирования данных в виде списка словарей.
import re
from bs4 import BeautifulSoup
data = '''<abc:ROW time_stamp="123">
<name>abcd</name>
<field1>field_value11</field1>
<field2>field_value12</field2>
</abc:ROW>
<abc:ROW time_stamp="456">
<name>abcd</name>
<field1>field_value21</field1>
<field2>field_value22</field2>
</abc:ROW>'''
abcd = []
soup = BeautifulSoup(data)
for abcTag in soup.find_all('abc:row'):
dict = {}
dict['field1'] = abcTag.field1.get_text()
dict['field2'] = abcTag.field2.get_text()
abcd.append(dict)
print(abcd)
Который печатает,
[{'field1': 'field_value11', 'field2': 'field_value12'}, {'field1': 'field_value21', 'field2': 'field_value22'}]
Надеюсь, это поможет, и дайте мне знать для любых запросов.
Редактировать: Решение с использованием чистого регулярного выражения в соответствии со специальным запросом OP
Существует два (и может быть несколько) <abc:ROW
тега, поэтому вы можете использовать это регулярное выражение
(?s)<abc.*?</abc:ROW>
для сопоставления текста в тегах, а затем итерации сопоставленного текста с использованием цикла for и последующего применения этого регулярного выражения,
<field1>(.*?)</field1>\s*<field2>(.*?)</field2>
для захвата field1
значения тега и field2
значение тега и сохраните их в словаре, и объявлениеd из словаря в список abcd
.
Вот код Python, чтобы дать вам идею,
import re
data = '''<abc:ROW time_stamp="123">
<name>abcd</name>
<field1>field_value11</field1>
<field2>field_value12</field2>
</abc:ROW>
<abc:ROW time_stamp="456">
<name>abcd</name>
<field1>field_value21</field1>
<field2>field_value22</field2>
</abc:ROW>'''
abcd = []
for abcTag in re.findall(r'(?s)<abc.*?</abc:ROW>',data):
dict = {}
match = re.search(r'<field1>(.*?)</field1>\s*<field2>(.*?)</field2>', abcTag)
dict['field1'] = match.group(1)
dict['field2'] = match.group(2)
abcd.append(dict)
print(abcd)
, который печатает следующий вывод, как вы ожидали,
[{'field1': 'field_value11', 'field2': 'field_value12'}, {'field1': 'field_value21', 'field2': 'field_value22'}]