Я не сильно изменил pattern
, потому что вы не объяснили, что именно хотите извлечь.
Когда вы сделаете вторую группу необязательной, все будет потреблено .*
, потому что это жадный , поэтому вам нужно исправить это первое .*?
.
, теперь вторая группа также должна быть вставлена в non capturing group
, чтобы совпадение либо текста заканчивалось чем-то вроде for 1 hour
иликонец строки \n
.
проверьте это:
import re
text = """
(1) Pay for zone 1234 for 1 hour
(2) Pay for zone 4567
(3) Pay for zone 1234 for 1 hour 30 minutes
"""
RE = r'(\d{4}).*?(?:(30 minutes|1 hour(?: 30 minutes)?|(?:[2-9]|1[0-9]|2[0-4]) hour(?: 30 minutes)?)|\n)'
# same thing using compile with flags MULTILINE
# RE = re.compile(r'(\d{4}).*?(?:(30 minutes|1 hour(?: 30 minutes)?|(?:[2-9]|1[0-9]|2[0-4]) hour(?: 30 minutes)?)|$)', flags=re.MULTILINE)
print(re.findall(RE, text))
ВЫХОД:
[('1234', '1 hour'), ('4567', ''), ('1234', '1 hour 30 minutes')]