Получение всех дат в формате с регулярным выражением с объяснениями - PullRequest
0 голосов
/ 23 мая 2019

Я придумал для себя упражнение, и теперь мне трудно понять, как работает регулярное выражение.Я хочу найти решение с правильным объяснением, чтобы я мог избавиться от некоторых сомнений по поводу регулярных выражений.Я пытаюсь все даты в моей строке;месяц, год и день.Вот моя строка и то, что я сделал:

   date_str="je suis ne le 23 Oct 2002,\
   I was born on 23 October 2002,\
   just Oct 23 2002,\
   ye gusta October 23 2002"

  re.findall(r' \d{2}\ ?[a-zA-Z]* \d{2,4}', date_str)

  #Out[162]:
  [' 23 Oct 2002', ' 23 October 2002', ' 23 2002', ' 23 2002']

Я также посмотрел некоторые коды, и иногда использовался знак вопроса и двоеточие, чтобы сказать, что группа встречается 0 или 1 раз.Я не знаю, что означает толстая кишка.Но я попробовал что-то еще, что также дает мне тот же результат, что и выше.

  re.findall(r' (?:\d{2})\ ?[a-zA-Z]*\ \d{2,4}', date_str)
  #Out[162]:
  [' 23 Oct 2002', ' 23 October 2002', ' 23 2002', ' 23 2002']

Во-первых, я не могу получить последние две даты, но я не могу понять, что такое двоеточиетак как я даже не вижу этого в своей строке.Плюс, почему я не могу получить знак вопроса вне группы?Это дает мне ошибку

1 Ответ

0 голосов
/ 23 мая 2019

Это может быть немного конкретным.В любом случае, может быть, это поможет вам.

import re

date_str="je suis ne le 23 Oct 2002,\
I was born on 23 October 2002,\
just Oct 23 2002,\
ye gusta October 23 2002"
a = re.findall(r'[a-zA-Z]+\s+\d+\s\d{2,4}|\d{1,2}\s*?[a-zA-Z]*\s*\d{2,4}', date_str)
print(a)

[«23 октября 2002», «23 октября 2002», «23 октября 2002», «23 октября 2002»]

"[a-zA-Z] + \ s + \ d + \ s \ d {2,4} | \ d {1,2} \ s *? [a-zA-Z] \ s \ d {2,4} "gm 1st Alternative [a-zA-Z] + \ s + \ d + \ s \ d {2,4} Соответствует одному символу, представленному в списке ниже [a-zA-Z] + +Квантификатор - сопоставляет от одного до неограниченного числа раз, сколько возможно, возвращая по мере необходимости (жадный) az один символ в диапазоне между (индекс 97) и z (индекс 122) (чувствительный к регистру) AZ один символ вдиапазон между A (индекс 65) и Z (индекс 90) (с учетом регистра) \ s + соответствует любому пробелу (равен [\ r \ n \ t \ f \ v]) + Quantifier - соответствует от одного до неограниченного времени,столько раз, сколько возможно, возвращая по мере необходимости (жадный) \ d + соответствует цифре (равной [0-9]) + Quantifier - Сопоставляет от одного до неограниченного количества раз, столько раз, сколько возможно, возвращая по мере необходимости (жадный)\ s соответствует любому символу пробела (равно [\ r \ n \ t \ f \ v]) \ d {2,4} соответствует цифре (равно [0-9]) {2,4} Квантификатор - соответствует от 2 до 4 раз столько раз, сколько возможно, возвращая при необходимости (жадный) 2-й вариант\ d {1,2} \ s *? [a-zA-Z] \ s \ d {2,4} \ d {1,2} соответствует цифре (равно [0-9]) {1,2} Квантификатор - Сопоставляет от 1 до 2 раз столько раз, сколько возможно, возвращая при необходимости (жадный) \ s *?соответствует любому пробелу (равен [\ r \ n \ t \ f \ v]) *?Квантификатор - сопоставляет от нуля до неограниченного числа раз, насколько это возможно, с расширением по мере необходимости (ленивый)

...