Сопоставьте все экземпляры в строке, используя регулярные выражения с несколькими группами - PullRequest
0 голосов
/ 05 октября 2019

У меня есть дамп json следующим образом:

{
    "field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
    "field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
    "field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
    "field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}

И регулярное выражение [0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}

Я хочу отобразить все совпадения (фактически сопоставляются все значения поля) со следующимКод Python

import re

regex = r'[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}'
j = """{
    "field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
    "field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
    "field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
    "field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}"""

re.search(regex, j)

При выполнении он только дает мне значение field1

<re.Match object; span=(24, 60), match='1234b077-fb81-4d5b-adf3-123cdb1b56cf'>

Я не знаю, пропустил ли я что-нибудь, чтобы напечатать все.

[ Обновлено ] re.findall() не дает ожидаемого результата.

pattern = re.compile(regex)
re.findall(pattern, j)

Результат не ожидается, это что-то вроде этого

['adf3-', '9ad6-', 'a337-', '93b7-']

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Вы можете использовать re.finditer для итерации по каждому неперекрывающемуся вхождению:

import re

regex = r'[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}'
data = """{
    "field1": "1234b077-fb81-4d5b-adf3-123cdb1b56cf",
    "field2": "111aa3f8-1cc3-4a75-9ad6-912a1d40781b",
    "field3": "c2b75f2d-85ef-4c7c-a111-5d2a41442dc3",
    "field4": "262d6922-53cf-4f9d-93b7-d6bae8711192"
}"""


for line in re.finditer(regex, data):
    print(line.group(0))

Отпечатки:

1234b077-fb81-4d5b-adf3-123cdb1b56cf
111aa3f8-1cc3-4a75-9ad6-912a1d40781b
c2b75f2d-85ef-4c7c-a111-5d2a41442dc3
262d6922-53cf-4f9d-93b7-d6bae8711192

См. Pyfiddle здесьдля демонстрации

0 голосов
/ 05 октября 2019

Вы можете использовать метод re.findall, который находит все экземпляры, а не только первый, как re.search.

re.findall, к сожалению, также включает группы совпадений, которые выиметь в вашем шаблоне - те части с паренами.

Возвращать все непересекающиеся совпадения шаблона в строке в виде списка строк. Строка сканируется слева направо, и совпадения возвращаются в указанном порядке. Если в шаблоне присутствует одна или несколько групп, вернуть список групп; это будет список кортежей, если в шаблоне более одной группы. Пустые совпадения включены в результат.

Возможно, re.finditer - лучший выбор для вашего варианта использования.

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