用于提取不同数据格式的正则表达式

问题描述 投票:0回答:1

我正在研究这个问题,并试图解决同样的问题。我必须提取插入到 txt 文件中的所有数据。到目前为止,我已经达到以下(几乎不可读)模式

import re
pattern = r'(?<![A-Za-z0-9-\./])\b(?:\d{1,2}[-/th|st|nd|rd\s.])?(?:(?:Jan|January|Feb|February|Mar|March|Apr|April|May|Jun|June|Jul|July|August|Sep|September|Oct|October|Nov|November|Dec|December)[\s,.]*)?(?:(?:\d{1,2})[-/th|st|nd|rd\s,.]*)?(?:\d{2,4})\b(?![A-Za-z0-9-/])'
dates = df.apply(lambda row: [match for match in re.findall(pattern, row)])

但是除了我的文本文件之外,还有一些数字被捕获,例如 29505 会被正则表达式捕获,但我未能成功修复它,因此不考虑 2、3、5 或更多位数。关于我能做什么的任何提示?将它们放在后置过滤器上是否更容易?

python regex date
1个回答
0
投票

正如您所提到的,“几乎可读的模式”可以变得可读 通过使用

x
标志,让您可以使用注释和空格。

然后我会提出一些改变/改进:

  • 使用
    i
    标志接受小写月份。
  • 检查日期是否在 1 到 31 之间。
  • 月份列表保持一致(3 个字符或完整的月份名称)。
  • 必须在日、月和年之间留出空格(也可能不是,由您决定)。

我会想出这个模式:

\b(?<![-./])      # Don't match if the number is preceded by '-', '.' or '/'
# Group 1: Day number, only between 1 and 31, with optional 0 prefix.
(0?[1-9]|[12]\d|3[0-1])
(?:th|st|[nr]d)?  # Optional st, th, rd, nd
\s+               # space(s) before month.
# Group 2: Month.
(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|
 June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|
 Nov(?:ember)?|Dec(?:ember)?)
\.?\s+            # Optional dot for month abbreviation and space(s).
# Group 3: Year.
(\d{2}(?:\d{2})?)
(?![-/]?\d)       # The year should not be followed by '-', '/' and digits.

在这里进行现场测试:https://regex101.com/r/TmhiNQ/1

并在Python中运行它:https://www.programiz.com/online-compiler/9Vr7225izGRPx

© www.soinside.com 2019 - 2024. All rights reserved.