【问题标题】:Python Regular expression does not match on year month combinationPython正则表达式与年月组合不匹配
【发布时间】:2020-10-22 10:06:12
【问题描述】:

我使用带有正则表达式的 Python 3.8.6 在字符串中查找英文月份+年份组合。因此我使用以下代码:

import re

regMonthPatternEn = 'an(?:uary)?|eb(?:ruary)?|march?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:usst)?|sep(?:tember)?|oct(?:ober)?|(nov|dec)(?:ember)'
regYearPattern = '.*([1-3][0-9]{3})'
text = 'january 2018'
resultMonthEn = re.match(regMonthPatternEn,text)
resultYear = re.match(regYearPattern,text.lower())
print(text)
print(workExperiencePeriodYearList)
if (resultMonthEn and resultYear):
    print('Match')

我希望这将在控制台中返回“匹配”作为输出。但它什么也不返回。你能帮我解决这个问题吗?

【问题讨论】:

  • 不应该是jan(?:uary)? 而不是an(?:uary)? 吗?
  • 您希望匹配哪些字符串? (他们真的会丢掉 Jan 和 Feb 的第一个字母,并用两个 s:es 拼错 August吗?)

标签: python python-3.x string date


【解决方案1】:

改为使用datetime 模块:

import datetime 
text = 'january 2018'
try:
  dt = datetime.datetime.strptime(text,'%B %Y')
except ValueError:
  print("Not match")
else:
  print("Match")

【讨论】:

  • 很好的答案,但它与 OP 正在寻找的短格式“jan 2020”不匹配。您也可以将 dt = datetime.datetime.strptime(text,'%b %Y') 添加到 except 分支以捕获该日期格式。
【解决方案2】:

来自re.match()的文档:

如果字符串开头的零个或多个字符匹配 正则表达式模式,返回对应的匹配对象。 如果字符串与模式不匹配,则返回 None;请注意,这 不同于零长度匹配。

您的正则表达式与 januaryj 不匹配(februaryf 也不匹配)。

此正则表达式适用于您的测试字符串:

regMonthPatternEn = 'jan(?:uary)|feb(?:ruary)|march?|apr(?:il)?|may|jun(?:e)?|jul(?:y)?|aug(?:usst)?|sep(?:tember)?|oct(?:ober)?|(nov|dec)(?:ember)'

编辑:正如@triplee 评论的那样,augusst 中有一个额外的s,您可能需要修复它。

【讨论】:

  • 可能还在修正 August 的拼写。
猜你喜欢
  • 1970-01-01
  • 2019-09-27
  • 2015-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多