Регулярное выражение для соответствия заданной строке даты c - PullRequest
0 голосов
/ 25 апреля 2020

Я ищу совпадение со строкой даты, как показано ниже

string1 = '11/13/2019 - 11/13/2019' 
string2 = '11/14/2019 11/14/2019'
string3 = '01/21/2019. . 11/20/2019'

Использую приведенный ниже код для извлечения всех из них.

match : r"(\d+[/1]\d+[/1]\d+[ - ]\d+[/1]\d+[/1]\d+)"

Но приведенное выше дает мне только строку 1 .

Edit: 

all string have two dates in common, I wanted to match it with both the date formats, ignoring the characters in between them. Is there a way to do this ?
ignore '-',' ', '. .'

любая помощь по этому вопросу.

Ответы [ 4 ]

3 голосов
/ 25 апреля 2020

Попробуйте с этим: (\d+[/]\d+[/]\d+[-\s\.]*\d+[/]\d+[/]\d+)

Демо здесь

1 голос
/ 25 апреля 2020

Основываясь на ответе @ GolamMazidsajib, если вы хотите быть более строгим в этом, ваше регулярное выражение должно выглядеть следующим образом:

^\d{2}/\d{2}/\d{4}[- .]+\d{2}/\d{2}/\d{4}$
  1. с добавлением ^ в начале и $ в конце гарантирует, что строка содержит только диапазон дат, а не something 11/14/2019 11/14/2019 something (если вы этого не хотите, просто удалите их)
  2. {2} и {4} вместо + после \d -s будет соответствовать только указанному количеству цифр, так что строки типа 111111/14/2019 11/14/2019 или 1/14/2019 11/14/2019 не будут приняты
  3. + вместо * после набора символов [-\s\.] потребует, чтобы строки имели как минимум один символ-разделитель между датами; например, отклонение 11/14/201911/14/2019
  4. вместо \s отфильтровывает строки, содержащие любые другие разделители пробелов, такие как новая строка \n или табуляция \t

Я также немного упростил это:

  • удалил ненужные наборы символов с одним sla sh в них: оба [/] и / соответствуют только одному символу "/ "
  • удален выход из точки . внутри набора символов [- .], поскольку внутри набора он ведет себя как литерал, а не как специальный символ
  • удаляет скобки группировки вокруг целого regex, поскольку они понадобятся вам только в том случае, если вы хотите извлечь совпадающую подстроку, что не соответствует предположению

См. demo .


Конечно, мы можем go дальше (возможно, даже немного за бортом) и попытаться приблизиться к сопоставлению только действительных дат, с чем-то вроде этого:

^(?:0[1-9]|1[0-2])/(?:0[1-9]|[12]\d|3[01])/\d{4}[- .]+(?:0[1-9]|1[0-2])/(?:0[1-9]|[12]\d|3[01])/\d{4}$
  • (?:0[1-9]|1[0-2]) - группа без захвата, которая соответствует eit ее (уведомление |)
    • 0[1-9] - 0 с последующим ди git с 1 до 9, или
    • 1[0-2] - 1 с последующим 0, 1 или 2
      , поэтому мы требуем, чтобы номер месяца равнялся 01, 02, 03,…, 12 и ничто иное
  • (?:0[1-9]|[12]\d|3[01]) также является группой без захвата, которая соответствует одной из трех последовательностей:
    • 0[1-9] - 0, за которыми следует ди git от 1 до 9, или
    • [12]\d - 1 или 2 с последующим любым ди git, или
    • 3[01] - 3 с 0 или 1 после него
      здесь мы требуем, чтобы день был одним из 01, 02, 03,…, 31 и ничего больше. Обратите внимание , что он не проверяет, совпадает ли месяц с номером дня, поэтому 02/31/2020 (31 февраля) будет разрешено
  • \d{4} слева как есть, допуская годы от 0000 до 9999

См. примеры в другом demo .

0 голосов
/ 25 апреля 2020

Вы можете использовать это одно регулярное выражение для обоих форматов:

^\d+/\d+/\d+\s(?:-\s)?\d+/\d+/\d+$

Демонстрация и объяснение

0 голосов
/ 25 апреля 2020

Я пытался использовать это, и это сработало.

[r"(\d+/\d+/\d+\s-\s\d+/\d+/\d+)", r"(\d+/\d+/\d+\s+\d+/\d+/\d+)"]
...