Извлечь возраст из струнного питона - PullRequest
2 голосов
/ 12 июня 2019

Рассмотрим эту строку:

s="""A25-54 plus affinities targeting,Demo (AA F21-54),
A25-49 Artist Affinity Targeting,M21-49 plus,plus plus A 21+ targeting"""

Я пытаюсь исправить свой шаблон, который в настоящее время не отображает все возрастные группы в строке (A 21+ отсутствует в текущем выводе).

Текущая попытка:

import re
re.findall(r'(?:A|A |AA F|M)(\d+-\d+)',s)

Выход:

['25-54', '21-54', '25-49', '21-49'] #doesnot capture the last group A 21+

Ожидаемый результат:

['A25-54','AA F21-54','A25-49','M21-49','A 21+']

Как вы видите, я бы хотел иметь последнюю группу, которая A 21+, которая в настоящее время отсутствует в моем выводе.

Также, если я могу получить строку, связанную с группой захвата. в настоящее время мой вывод, кроме того, что он не охватывает все группы, не содержит строки до возрастной группы. Например: я хочу 'A25-54 вместо '25-54', я думаю, из-за ?:.

Ценю любую помощь, которую я могу получить.

1 Ответ

2 голосов
/ 12 июня 2019

Отсутствующая часть соответствия связана с тем, что ваш шаблон содержит одну группу захвата, и как только в регулярном выражении есть группа захвата, re.findall возвращает только эти части. Вторая проблема заключается в том, что вы должны сопоставить либо -, за которым следуют 1 или более цифр или буквальный символ + после того, как сопоставлены первые одна или несколько цифр.

Вы можете использовать

(?:A|A |AA F|M)\d+(?:-\d+|\+)

ПРИМЕЧАНИЕ : Возможно, вы захотите добавить границу слова в начале, чтобы соответствовать только тем A, AA F и т. Д. Как целым словам: r'\b(?:A|A |AA F|M)\d+(?:-\d+|\+)'.

См. Демонстрационную версию регулярных выражений и график регулярных выражений :

enter image description here

Детали

  • (?:A|A |AA F|M) - группа без захвата, соответствующая A, A , AA , AA F или M
  • \d+ - 1+ цифр
  • (?:-\d+|\+) - группа без захвата, соответствующая - и 1+ цифрам после нее или одному символу +.

Демо Python :

import re
s="""A25-54 plus affinities targeting,Demo (AA F21-54),
A25-49 Artist Affinity Targeting,M21-49 plus,plus plus A 21+ targeting"""
print(re.findall(r'(?:A|A |AA F|M)\d+(?:-\d+|\+)',s))
# => ['A25-54', 'AA F21-54', 'A25-49', 'M21-49', 'A 21+']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...