Регулярные выражения «И» в выражении извлекают это и то

#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']]