@exctac

Группировать совпадения в регулярном выражении?

Здравствуйте. Есть отдельные строки, состоящие из начальной и конечной даты:
апрель 2007 - март 2014
март 2007 - ...
март 2007 -> 2014
(2007 - год 2014)
(2007 - 2014)

нужна регулярка проверяющая каждую строку. Регулярка состоит из 2-х групп, первая ищет первую дату, вторая ищет вторую. таким образом ответ при вызове re.findall должен выдавать пару:
('апрель 2007', 'март 2014')
('март 2014', '')
('март 2007', '2014')
('2007', 'год 2014')
('2007', '2014')

Если использовать только r'[А-Яа-я]+\s\d{4}|\d{4}', re.findall выдает список всех совпадений, а мне нужна именно пара. Наверно что-то типа этого:
r'([А-Яа-я]+\s\d{4}|\d{4}) ([А-Яа-я]+\s\d{4}|\d{4})'

Как можно этого достичь?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
DDDsa
@DDDsa
Отвечаю буквально на ваш вопрос. Вот такая регулярка сработает:

[\s\W]*((?:\w*\s+)?\d+)?[\s\W]+((?:\w*\s+)?\d+)?[\s\W]*


Или такая, более лояльная:

[\s\W]*([\w\s\d]+)?[\s\W]+([\w\s\d]+)?[\s\W]*

пример:

>>> p = r'[\s\W]*((?:\w*\s+)?\d+)?[\s\W]+((?:\w*\s+)?\d+)?[\s\W]*'
>>> source = '''апрель 2007 - март 2014
... март 2007 - ...
... март 2007 -> 2014
... (2007 - год 2014)
... (2007 - 2014)'''
>>> for line in source.split('\n'):
...     print(re.findall(p, line))
...
[('апрель 2007', 'март 2014')]
[('март 2007', '')]
[('март 2007', '2014')]
[('2007', 'год 2014')]
[('2007', '2014')]


Но всё-таки я бы порекомендовал поискать другое решение. Такой код абсолютно не читаемый.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Drill
Можно и без регекса:

source = '''апрель 2007 - март 2014
март 2007 - ...
март 2007 -> 2014
(2007 - год 2014)
(2007 - 2014)'''

In [21]: for line in source.split('\n'):
    ...:     print(line.translate(str.maketrans('','','().>')).split(' - '))
    ...: 
['апрель 2007', 'март 2014']
['март 2007', '']
['март 2007', '2014']
['2007', 'год 2014']
['2007', '2014']
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы