【问题标题】:re pattern to include year of dates重新模式以包括日期的年份
【发布时间】:2021-09-10 05:52:58
【问题描述】:

我对包含日期年份的 re 模式有一些问题。

代码

import re

text ="May 2020 Musical Portraits September 24 - 25, 2021 Time: 8:00 pm Toledo Museum of Art Peristyle  Romeo & JulietSpecial EventWhenFriday, Mar 23 / 20187:30pmBuy TicketsSunday, Mar 25 / 20182:30pmBuy TicketsWhereSamford University Wright CenterMap & DirectionsArtist"
format_list = ["(?:(?:(?:j|J)an)|(?:(?:f|F)eb)|(?:(?:m|M)ar)|(?:(?:a|A)pr)|(?:(?:m|M)ay)|(?:(?:j|J)un)|(?:(?:j|J)ul)|(?:(?:a|A)ug)|(?:(?:s|S)ep)|(?:(?:o|O)ct)|(?:(?:n|N)ov)|(?:(?:d|D)ec))\w*(?:\s)?(?:\n)?[0-9]{1,2}(?:\s)?(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4}(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4}"]

all_dates=[]

for pattern in format_list:
    all_dates = re.findall(pattern, text)
    if all_dates == []:
        continue
    else:
        for index,txt in enumerate(all_dates):
            text = re.sub('([^\x00-\x7F]+)|(\n)|(\t)',' ', txt)
            all_dates[index] = text
    print(all_dates)

输出

['September 24 - 25, 2021', 'Mar 23 / 20187', 'Mar 25 / 20182']

所需的输出

['September 24 - 25, 2021', 'Mar 23 / 2018', 'Mar 25 / 2018']

问题

我得到的是"…20187""…20182",而不是"…2018"

【问题讨论】:

    标签: python python-3.x regex python-re


    【解决方案1】:

    这种模式可能会完成您需要的工作

    (?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\w{0,6}\s+[\d\s\-\\/,]+?\d{4}
    

    代码:

    import re
    
    text ="May 2020 Musical Portraits September 24 - 25, 2021 Time: 8:00 pm Toledo Museum of Art Peristyle  Romeo & JulietSpecial EventWhenFriday, Mar 23 / 20187:30pmBuy TicketsSunday, Mar 25 / 20182:30pmBuy TicketsWhereSamford University Wright CenterMap & DirectionsArtist"
    format_list  = [
        # r"(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\w{0,6}[\d\s\-\\/,]*?\d{4}",  # If you want to also match e.g. May 2020
        r"(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\w{0,6}\s+[\d\s\-\\/,]+?\d{4}",
    ]
    
    for pattern in format_list:
        all_dates = re.findall(pattern, text, re.IGNORECASE)
        print(all_dates)
    

    输出:

    ['September 24 - 25, 2021', 'Mar 23 / 2018', 'Mar 25 / 2018']
    

    地点:

    • (?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) - 匹配月份的前缀
    • \w{0,6} - 可选匹配月份的全名,最长的是“sep”(来自上一个匹配项)+“tember”
    • \s+ - 匹配 1 个或多个空格。
    • [\d\s\-\\/,]+? - 匹配天数部分,无论是用空格、破折号还是斜线分隔。
    • \d{4} - 匹配年份部分。

    请注意,由于正则表达式只是基于字符串的处理,因此您将在此处受限于 "mon day, year" 格式。您将需要其他模式来匹配不同的可能日期格式。您可能想探索可以扫描文本的日期解析器。

    【讨论】:

    • 我们如何才能从该列表中避免 2020 年 5 月?
    • @Aniiya0978 你可以只使用第二种模式。为避免混淆,我在答案中注释掉了第一个模式。你能检查一下它是否对你有用吗?
    【解决方案2】:

    只需从您的format_list 中取出最后一个(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4},它应该可以正常工作。只需使用下面的format_list

    format_list = ["(?:(?:(?:j|J)an)|(?:(?:f|F)eb)|(?:(?:m|M)ar)|(?:(?:a|A)pr)|(?:(?:m|M)ay)|(?:(?:j|J)un)|(?:(?:j|J)ul)|(?:(?:a|A)ug)|(?:(?:s|S)ep)|(?:(?:o|O)ct)|(?:(?:n|N)ov)|(?:(?:d|D)ec))\w*(?:\s)?(?:\n)?[0-9]{1,2}(?:\s)?(?:\,|\.|\/|\-)?(?:\s)?[0-9]{2,4}"]
    

    【讨论】:

    • 它将删除第一个日期的年份部分。
    • 如果只有像 2020 年 5 月这样的月份和年份,那么它也会被这种模式检测到。我正在尝试更紧密的模式
    • @Aniiya0978 尝试解释您要完成的工作。更紧密的模式是什么意思。
    • @adamkwm 哦,我没看到那个,让我试着修复它。
    猜你喜欢
    • 2018-04-13
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2012-08-06
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多