Я борюсь с python регулярным выражением, чувствуя, что моя проблема проста, но я застрял. Я пытаюсь идентифицировать подстроку даты в строгом формате YYYY-MM-DD внутри строки. Достаточно просто. Но я хочу быть уверен, что регулярное выражение не обнаруживает ложноположительных результатов. Некоторые примеры исходной строки, которые мне нужно продолжить:
string1='foo2012-09-2018-09-03foo'
string2='2012-09-2018-09-03'
Я хочу извлечь строку, представляющую строку даты 2018-09-03
и , а не эту строку 2012-09-20
. Я пробовал различные картины. Basi c один что-то вроде:
import re
string1='foo2012-09-2018-09-03foo'
string2='2012-09-2018-09-03'
pattern = '[\d]{4}[-_.][\d]{2}[-_.][0-3][\d]'
for match in re.finditer(pattern, string1):
print(match)
# FAIL : <re.Match object; span=(3, 13), match='2012-09-20'>
for match in re.finditer(pattern, string2):
print(match)
# FAIL : <re.Match object; span=(0, 10), match='2012-09-20'>
Хорошо, не работает, давайте изменим шаблон, чтобы проверить, если предыдущий и следующий символ не ди git:
pattern = '[\D][\d]{4}[-_.][\d]{2}[-_.][0-3][\d][\D]'
for match in re.finditer(pattern, string1):
i, j = match.span()
if string1[i] not in '0123456789': i+=1
if string1[j] not in '0123456789': j-=1
print(string1[i:j])
# SUCCESS : 2018-09-03
for match in re.finditer(pattern, string2):
i, j = match.span()
if string2[i] not in '0123456789': i+=1
if string2[j] not in '0123456789': j-=1
print(string2[i:j])
# FAIL : no match !
Второй не работает, потому что в string2
нет символа после подстроки, которую я ищу. Есть ли способ изменить шаблон так, чтобы он искал дату, за которой следовал бы не десятичный ди git или конец строки?
PS: первое сообщение!