#python #regex
#python #регулярное выражение
Вопрос:
Я изо всех сил пытаюсь написать регулярное выражение, которое выделяет следующие цифры жирным шрифтом ниже. Я настроил 3 разных регулярных выражения для каждого значения, но поскольку последнее значение может иметь пробел между ними, я не знаю, как разместить здесь «И».
tire = ‘Tire: P 275/65 R 18 A / S; 275/65 R 18 A / T OWL;265/70 R 17 A / T OWL; ‘
Я пробовал это, и это работает для первых 2, но не для последнего. Я хотел бы иметь последнее в одном регулярном выражении.
p1 = re.compile(r'(d )/')
p2 = re.compile(r'/(d )')
p3 = re.compile(r'(?=.*[R](d ))(?=.*[R]s(d ))')
Я пробовал разные вещи, и это последний код, который я пробовал с неудачными результатами
если я сделаю это
p1.findall(tire), p2.findall(tire), p3.findall(tire)
Я хотел бы видеть это:
(['275', '275', '265'], ['65', '65', '70'], ['18', '18', '17'])
Ответ №1:
Вы были почти там! Вам не нужны три отдельных регулярных выражения. Вместо этого используйте несколько групп захвата в одном регулярном выражении.
(d{3})/(d{2})Rs?(d{2})
Попробуйте: https://regex101.com/r/Xn6bry/1
Объяснение:
(d{3})
: Захват трех цифр/
: Сопоставьте косую черту(d{2})
: Захват двух цифрRs?
: СопоставьтеR
, за которым следует необязательный пробел(d{2})
: Захват двух цифр.
В Python выполните:
p1 = re.compile(r'(d{3})/(d{2})Rs?(d{2})')
tire = 'Tire: P275/65R18 A/S; 275/65R 18 A/T OWL;265/70R 17 A/T OWL;'
matches = re.findall(p1, tire)
Теперь, если вы посмотрите matches
, вы получите
[('275', '65', '18'), ('275', '65', '18'), ('265', '70', '17')]
Преобразование этого в нужный формат должно быть довольно простым:
# Make an empty list-of-list with three entries - one per group
groups = [[], [], []]
for match in matches:
for groupnum, item in enumerate(match):
groups[groupnum].append(item)
Теперь groups
[['275', '275', '265'], ['65', '65', '70'], ['18', '18', '17']]