如何使用Regex从包含给定Pandas DataFrame的不同类型日期格式的指定列中提取日期

emeijp43  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(82)
def find_valid_dates(dt):
    result = re.findall("\d{1,2}-\d{2}-\d{2,4}|\d{1,2} (?:januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december) \d{1,4}", dt)
    # result = re.findall("\d{2}-\d{2}-\d{4}|[a-zA-Z]+\s+\d{4}",dt)
    return result

SaaOne_msi_vervangen['valid_dates']=SaaOne_msi_vervangen['Oplossingstekst'].apply(lambda dt : find_valid_dates(dt))

我的dataframe SaaOne_msi_vervangen的“Oplossingstekst”列包含不同格式的多个日期。例如:2020年6月14日及2023年10月2日。我尝试在我的findall中使用or运算符提取这两个日期,但到目前为止,这段代码并没有提取2023年10月2日。这可能与白色空间有关。我该如何解决这个问题?

uinbv5nw

uinbv5nw1#

您可能遇到的空间问题

我个人会将空间" "替换为\s\s+。这样,您就可以匹配所有类型的空格(和新行)。但是,您可以更严格地使用 horizontal whitespace chars = \h(在Python中似乎不可用,但等效于[\t\x{00A0}\x{1680}\x{180E}\x{2000}\x{2001}\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}\x{200A}\x{202F}\x{205F}\x{3000} ])。名单可以减少。由您决定是否匹配它一次或多次。

带捕获组的正则表达式

由于您可能需要在稍后解析日期,因此让我们在一些命名的捕获组中捕获日、月和年。我建议这样做:

regex = r"""
    \b # word boundary
    (?: # non-capturing group for the "or"
      # Short notation: 14-06-2022, 1-05-23
      (?P<short>
        (?P<short_day>\d{1,2})
        -
        (?P<short_month>\d{2})
        -
        (?P<short_year>\d{2}|\d{4})
      )
      | # Or
      # Text notation: 2 oktober 2023, 31 december 23
      (?P<text>
        (?P<text_day>\d{1,2}) # day
        \s+ # white spaces
        (?P<text_month>
          januari|februari|maart|april|mei|juni|juli|
          augustus|september|oktober|november|december
        )
        \s+ # white spaces
        (?P<text_year>\d{2}|\d{4}) # year with 2 or 4 digits, but not 3.
      )
    )
    \b # word boundary
    """
matches = re.finditer(regex, test_str, re.VERBOSE | re.IGNORECASE)

我使用了这些标志:

*x= re.VERBOSE。extended/verbose标志允许您在正则表达式中放置一些注解。
*i= re.IGNORECASE

对于年份,我认为\d{2,4}不是最好的,因为它将匹配3位数,而不是真正有效的年份值。我用\d{2}|\d{4}替换了它。
我还添加了单词边界\b,以避免匹配“1-06-123456”的一部分,这可能是一个产品ID或其他任何东西。
您可以play with this regex101并使用 Code Generator 来测试Python代码。

相关问题