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))

我的数据帧SaaOne_MSI_vervangen的"Oplossingstekst"列包含多个不同格式的日期.例如:14-06-2020和2 Oktober 2023.我试图在findall中使用or运算符来提取这两个日期,但到目前为止,此代码没有提取2023年2 Oktober.这可能与空格有关.我怎么才能解决这个问题?

推荐答案

你可能遇到的空间问题

我个人会用\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.Ex已向/详细标志允许您将一些 在您的正则表达式中添加注释.

  • i=re.IGNORECASE

对于年份,我认为\d{2,4}不是最好的,因为它将匹配3位数,而不是真正有效的年份值.我把它换成了\d{2}|\d{4}.

我还在周围添加了单词边界\b,以避免与 "1-06-123456",可以是产品ID或其他任何东西.

你可以play with this regexCode Generator和 使用Code Generator测试Python代码.

Python相关问答推荐

如何从维基百科的摘要部分/链接列表中抓取链接?

自动编码器和极坐标

无法导入已安装的模块

已删除的构造函数调用另一个构造函数

给定数据点,制定它们的关系

将numpy矩阵映射到字符串矩阵

使用图片生成PDF Django rest框架

如何使用Jinja语法在HTML中重定向期间传递变量?

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

Select 用a和i标签包裹的复选框?

抓取rotowire MLB球员新闻并使用Python形成表格

需要计算60,000个坐标之间的距离

Pandas 有条件轮班操作

为什么这个带有List输入的简单numba函数这么慢

图像 pyramid .难以创建所需的合成图像

如何更改分组条形图中条形图的 colored颜色 ?

如何从pandas的rame类继承并使用filepath实例化

对象的`__call__`方法的setattr在Python中不起作用'

使用groupby方法移除公共子字符串

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败