在正则表达式中缺少前导或尾随空格将使搜索无效



我正在尝试使用正则表达式在字符串中搜索不同类型的日期。

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

有人能帮助为什么txt3txt5不工作吗?基本上,当日期(?:[,| ,|, |-|/|\|s|d{0}])

没有前导或尾随空间时,regex的以下部分不工作

可以使用

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)—非零数字,10293031
  • (?:Nov|Dec)(month_rx) -NovDec
  • [s,/\-](sep_rx) -空格、逗号、斜杠、反斜杠或连字符。

(?<!d)的反向查找确保当前位置的左边没有数字,(?!d)的反向查找确保当前位置的右边没有数字。

相关内容

最新更新