re.findall найти только половину паттернов

Я использую re.findall для анализа года и месяца из строки, однако она выводит шаблоны только из половины строки. Почему это?

date_string = '2011-1-1_2012-1-3,2015-3-1_2015-3-3'

find_year_and_month = re.findall('[1-2][0-9][0-9][0-9]-[1-12]', date_string)

print(find_year_and_month)

и мой вывод такой:

['2011-1', '2012-1']

Это текущий результат для тех дат, но почему я получаю сопоставление с образцом только для половины строки?

2 ответа

Решение

[1-12] не делает то, что вы думаете, что делает. Это соответствует всему в диапазоне 1 в 1или это соответствует 2,

Смотрите этот вопрос для некоторых вариантов замены регулярных выражений, таких как ([1-9]|1[0-2]): Как представить диапазон номеров регулярных выражений (например, от 1 до 12)?

Если вам нужен интерактивный инструмент для экспериментов с регулярными выражениями, я лично рекомендую регулярное выражение.

Настройте шаблон регулярных выражений, как показано ниже:

import re

date_string = '2011-1-1_2012-1-3,2015-3-1_2015-3-3'    
find_year_and_month = re.findall('([1-2][0-9]{3}-(?:1[0-2]|[1-9]))', date_string)

print(find_year_and_month)

Выход:

['2011-1', '2012-1', '2015-3', '2015-3']
Другие вопросы по тегам