Я пытаюсь написать регулярное выражение, чтобы найти конкретную подстроку в строке.
Я ищу даты в следующем формате:
"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}
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
Пытаться
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'>
[A-Z]
- любая заглавная буква[a-z]+
состоит из 1 или более строчных букв\s+
это 1 или более пробелов\d{1,2}
не менее 1 и не более 2 цифр
import re
my_string = "January 01, 1990\n By SomeAuthor"
regex = re.compile('\w+\s+\d+, \d{4}')
result = regex.search(my_string)
Результат будет содержать совпавший текст и диапазон символов.
Вот:
re.search("\w+\s+\d\d?\s*,\s*\d{4}",date_string)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.