我正在尝试使用正则表达式在字符串中搜索不同类型的日期。
import re
txt1 = "The date is 3-Dec "
txt2 = "The date is3-Dec "
txt3 = "The date is 3-Dec"
txt4 = "The date is Dec-20"
txt5 = "The date isDec-20"
regx = r"(?:d{2}|d{1}|d{0})(?:[,| ,|, |-|/|\|s|d{0}])(?:%s)(?:[,| ,|, |-|/|\|s|d{0}])(?:d{4}|d{2}|d{0})" % '|'.join(['Nov', 'Dec'])
x1 = re.findall(regx, txt1)
print(x1)
x2 = re.findall(regx, txt2)
print(x2)
x3 = re.findall(regx, txt3)
print(x3) # empty
x4 = re.findall(regx, txt4)
print(x4)
x5 = re.findall(regx, txt5)
print(x5) # empty
有人能帮助为什么txt3
和txt5
不工作吗?基本上,当日期(?:[,| ,|, |-|/|\|s|d{0}])
可以使用
months = ['Nov', 'Dec']
date_rx = r'(?:[1-9]|[12]d|3[01])'
month_rx = r'(?:{})'.format('|'.join(months))
sep_rx = r'[s,/\-]'
regx = r"(?<!d){0}{2}{1}|{1}{2}{0}(?!d)".format(date_rx, month_rx, sep_rx)
查看在线Python演示。正则表达式是
(?<!d)(?:[1-9]|[12]d|3[01])[s,/\-](?:Nov|Dec)|(?:Nov|Dec)[s,/\-](?:[1-9]|[12]d|3[01])(?!d)
参见regex演示。
正则表达式部件详细信息:
(?:[1-9]|[12]d|3[01])
(date_rx
)—非零数字,10
到29
或30
或31
(?:Nov|Dec)
(month_rx
) -Nov
或Dec
[s,/\-]
(sep_rx
) -空格、逗号、斜杠、反斜杠或连字符。
(?<!d)
的反向查找确保当前位置的左边没有数字,(?!d)
的反向查找确保当前位置的右边没有数字。