Я пытаюсь написать регулярное выражение, чтобы найти конкретную подстроку в строке.

Я ищу даты в следующем формате:

"January 1, 2018"

Я уже провел некоторое исследование, но не смог выяснить, как составить регулярное выражение для моего конкретного случая.

Текущая версия моего регулярного выражения

re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string)

Я довольно неопытен с регулярными выражениями, но прочитав документацию, я смог придумать, насколько соответствует формат даты, с которым я работаю.

Вот мой мыслительный процесс за моим регулярным выражением:

\w должен совпадать с любым символом слова в юникоде, а * должен повторять предыдущее совпадение, поэтому они вместе должны соответствовать чему-то вроде этого «января». ? делает * не жадным, поэтому он не будет пытаться сопоставить что-либо в форме January 20, так как он должен останавливаться на первом символе пробела.

\s должен соответствовать пробелу.

\d\d и \d\d\d\d должны соответствовать двухзначному и четырехзначному числу соответственно.

Вот тестируемый пример моего кода:

import re
my_string = "January 01, 1990\n By SomeAuthor"
print(re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string))

РЕДАКТИРОВАТЬ:

Я также попробовал: [A-Za-z]\s\d{1,2}\s\d{2, 4}

0
K-Log 21 Авг 2018 в 02:23

4 ответа

Лучший ответ

Ваш шаблон может быть немного жадным в некоторых областях, например, в названии месяца. Кроме того, вам не хватает дополнительной запятой. Наконец, вы можете использовать флаг игнорирования регистра, чтобы упростить ваш шаблон. Вот пример использования re в подробном режиме.

import re

text = "New years day was on January 1, 2018, and boy was it a good time!"
pattern = re.compile(r"""
    [a-z]+  # at least one+ ascii letters (ignore case is use)
    \s      # one space after
    \d\d?   # one or two digits
    ,?      # an oprtional comma
    \s      # one space after
    \d{4}   # four digits (year)
""",re.IGNORECASE|re.VERBOSE)

result = pattern.search(text).group()
print(result)

Выход

January 1, 2018
2
nicholishen 20 Авг 2018 в 23:40

Пытаться

In [992]: my_string = "January 01, 1990\n By SomeAuthor"
     ...: print(re.search("[A-Z][a-z]+\s+\d{1,2},\s+\d{4}", my_string))
     ...:
<_sre.SRE_Match object; span=(0, 16), match='January 01, 1990'>
  1. [A-Z] - любая заглавная буква
  2. [a-z]+ состоит из 1 или более строчных букв
  3. \s+ это 1 или более пробелов
  4. \d{1,2} не менее 1 и не более 2 цифр
2
aydow 20 Авг 2018 в 23:36
import re
my_string = "January 01, 1990\n By SomeAuthor"
regex = re.compile('\w+\s+\d+, \d{4}')
result = regex.search(my_string)

Результат будет содержать совпавший текст и диапазон символов.

0
mgh 20 Авг 2018 в 23:33

Вот:

re.search("\w+\s+\d\d?\s*,\s*\d{4}",date_string)
0
igon 20 Авг 2018 в 23:29
51939680