【问题标题】:python regex of a date in some text, enclosed by two keywords某些文本中日期的python正则表达式,由两个关键字括起来
【发布时间】:2010-05-06 17:59:42
【问题描述】:

这是question 的第 2 部分,非常感谢 David 的answer。如果我需要提取以两个关键字为界的日期怎么办?

例子:

text = "One 09 Jun 2011 Two 10 Dec 2012 Three 15 Jan 2015 End"

Case 1 bounding keyboards: "One" and "Three"
Result expected: ['09 Jun 2011', '10 Dec 2012']

Case 2 bounding keyboards: "Two" and "End"
Result expected: ['10 Dec 2012', '15 Jan 2015']

谢谢!

【问题讨论】:

标签: python regex


【解决方案1】:

您可以使用两个正则表达式来做到这一点。一个正则表达式获取两个关键字之间的文本。另一个正则表达式提取日期。

match = re.search(r"\bOne\b(.*?)\bThree\b", text, re.DOTALL)
if match:
    betweenwords = match.group(1)
    dates = re.findall(r'\d\d (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}', betweenwords) 

【讨论】:

  • 它有效,谢谢!除了 re.findal(..., text) 应该是 re.findall(..., betweenwords) 顺便说一句,第一个正则表达式中是否需要第一个和最后一个“\b”?
  • 我已经更正了findall 参数。如果您希望将您的单词作为整个单词进行匹配,则所有 4 个 \b 都是必需的。例如。 \bEnd\b 无法匹配 Ending。如果你不在乎你的两个关键词是全词还是部分词,那么你可以省略所有 4 个\b
【解决方案2】:

您真的需要担心关键字吗?你能保证关键词不会改变吗?

如果不是,与上一个问题完全相同的解决方案可以解决这个问题:

>>> import re
>>> text = "One 09 Jun 2011 Two 10 Dec 2012 Three 15 Jan 2015 End"
>>> match = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)
>>> match
['09 Jun 2011', '10 Dec 2012', '15 Jan 2015']

如果你真的只需要两个日期,你可以使用列表切片:

>>> match[:2]
['09 Jun 2011', '10 Dec 2012']
>>> match[1:]
['10 Dec 2012', '15 Jan 2015']

【讨论】:

  • 关键字(用户定义)对于排除不在文档相关部分内的某些日期很重要。
  • 那么关键字会不一样,长度会变?您将不得不使用贪婪匹配。只有字母还是字母数字?这些都是构建模式时的重要考虑因素。
  • 请考虑边界关键字是2个常量字符串。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多