我正在使用正则表达式来提取文本中日期对的月份和年份:

regex = (
    r"((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?(t)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)"
    r"\s?[\.\s\’\’\,\/\'\,\‘\-\–\—]?\s?(\d{4}|\d{2})?\s?\s?((to)|[\|\-\–\—])\s?\s?"
    r"((Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?(t)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)"
    r"\s?[\.\s\’\’\,\/\'\,\‘\-\–\—]?\s?(\d{4}|\d{2})|(Present|Now|till\s?(now|date|today)?|current)))"
)

当我使用一些输入测试正则表达式时,这些输入在一些输入中包含月份的日期,而在其他输入中不包含:

lst = [
    'July 2014 - 28th August 2014',
    'Jan 2012 - 3rd sep 2014',
    'Jan 2008 - May 2012',
    'Jan 2008 and May 2012'
]
for i in lst:
    word = re.finditer(regex,i,re.IGNORECASE)
    for match in word:
        print(match.group())

我得到以下输出:

Jan 2008 - May 2012

但我的预期输出是:

July 2014 - August 2014
Jan 2012 - sep 2014
Jan 2008 - May 2012

我需要更改什么才能使正则表达式与日期中具有可选日期的文本匹配?当日期字符串包括日期时,它始终是一个带有stndrdth后缀的序号.

推荐答案

在一次匹配操作中,您不能"跳过"字符串的一部分,因此,如果您有26th August个字符串,则不能只匹配或捕获26 August个字符串.在这些情况下,您要么需要捕获匹配的部分,然后将它们连接起来,要么替换不需要的部分作为后处理步骤.

因此,在这里,我将使用后处理替换方法

import re


day = r'(?:((?:0?[1-9]|[12]\d|3[01])(?:\s*(?:st|[rn]d|th))?)\s*)?'
month = r'(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)' 
year = r'(\d{2}(?:\d{2})?)'
rx_valid = re.compile( fr'\b{day}{month}\s*{year}\s*[-—–]\s*{day}{month}\s*{year}(?!\d)', re.IGNORECASE )
rx_ordinal = re.compile( r'\s*\d+\s*(?:st|[rn]d|th)', re.IGNORECASE )

lst = [
    'July 2014 - 28th August 2014',
    'Jan 2012 - 3rd sep 2014',
    'Jan 2008 - May 2012',
    'Jan 2008 and May 2012'
]
for i in lst:
    word = rx_valid.finditer(i)
    for match in word:
        print(rx_ordinal.sub("", match.group()))

输出:

July 2014 - August 2014
Jan 2012 - sep 2014
Jan 2008 - May 2012

请看Python demoregex demo.

Python相关问答推荐

如何将uint 16表示为float 16

使用decorator 自动继承父类

使用regex分析具有特定字符的字符串(如果它们存在)

请从Python访问kivy子部件的功能需要帮助

opencv Python稳定的图标识别

如何使用没有Selenium的Python在百思买着陆页面上处理国家/地区 Select ?

Odoo -无法比较使用@api.depends设置计算字段的日期

线性模型PanelOLS和statmodels OLS之间的区别

我从带有langchain的mongoDB中的vector serch获得一个空数组

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

连接两个具有不同标题的收件箱

根据在同一数据框中的查找向数据框添加值

有症状地 destruct 了Python中的regex?

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

python中字符串的条件替换

如何在表中添加重复的列?

Pandas:填充行并删除重复项,但保留不同的值

使用字典或列表的值组合

使用类型提示进行类型转换