【问题标题】:Regular expression to find a date substring Python 3.7正则表达式查找日期子字符串 Python 3.7
【发布时间】:2018-08-20 23:23:44
【问题描述】:

我正在尝试编写一个正则表达式来查找字符串中的特定子字符串。

我正在寻找以下格式的日期:

"January 1, 2018"

我已经做了一些研究,但还没有弄清楚如何为我的具体情况制作正则表达式。

我的正则表达式的当前版本是

re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string)

我对正则表达式相当缺乏经验,但通过阅读文档,只要匹配我正在使用的日期格式,这就是我能想到的。

这是我的正则表达式背后的思考过程:

\w 应该匹配任何 unicode 单词字符,* 应该重复之前的匹配,所以它们一起应该匹配像“一月”这样的东西。 ? 使 * 不贪婪,因此它不会尝试匹配 January 20 形式的任何内容,因为它应该在第一个空格字符处停止。

\s 应该匹配空白。

\d\d\d\d\d\d 应分别匹配两位数和四位数字。

这是我的代码的可测试示例:

import re
my_string = "January 01, 1990\n By SomeAuthor"
print(re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string))

编辑:

我也试过了:[A-Za-z]\s\d{1,2}\s\d{2, 4}

【问题讨论】:

  • 你根本不匹配逗号...
  • 哦,我完全错过了,感谢您指出这一点。
  • print(re.search(r'\w*\s\d{1,2},\s\d{2,4}', my_string).group() 可以工作...括号中的carrefoul 空格和逗号要添加

标签: python regex python-3.x


【解决方案1】:

您的模式在某些区域(例如月份名称)可能有点贪婪。此外,您缺少可选的逗号。最后,您可以使用忽略大小写标志来简化您的模式。这是在详细模式下使用 re 的示例。

import re

text = "New years day was on January 1, 2018, and boy was it a good time!"
pattern = re.compile(r"""
    [a-z]+  # at least one+ ascii letters (ignore case is use)
    \s      # one space after
    \d\d?   # one or two digits
    ,?      # an oprtional comma
    \s      # one space after
    \d{4}   # four digits (year)
""",re.IGNORECASE|re.VERBOSE)

result = pattern.search(text).group()
print(result)

输出

January 1, 2018

【讨论】:

  • 不需要捕获括号; Python 匹配对象已经捕获了匹配的文本,因此您的代码在没有括号的情况下可以正常工作(省略括号可以避免毫无意义地捕获两次匹配)。
【解决方案2】:

试试

In [992]: my_string = "January 01, 1990\n By SomeAuthor"
     ...: print(re.search("[A-Z][a-z]+\s+\d{1,2},\s+\d{4}", my_string))
     ...:
<_sre.SRE_Match object; span=(0, 16), match='January 01, 1990'>
  1. [A-Z] 是任何大写字母
  2. [a-z]+ 是 1 个或多个小写字母
  3. \s+ 是 1 个或多个空格字符
  4. \d{1,2} 至少为 1 位,最多为 2 位数字

【讨论】:

  • 使用\d\d?,而不是\d{2} ...一个月中的日期可能只有一位,\w 也不适用于这个问题(它也会匹配数字,它的更有可能我们只想匹配字母)
  • 另外,您可能还想在逗号周围添加可选空格。
  • Mind \w 也匹配数字和下划线。
  • 而且您几乎肯定想要使用单词边界标记,因此您不会匹配字符串12345 甚至1234abcd 中的1234。为了安全起见,您想使用原始字符串文字(因为否则\b 表示退格,而不是单词边界),使其成为r"\b\w+\s+\d{1,2},\s+\d{4}\b"
【解决方案3】:

这里:

re.search("\w+\s+\d\d?\s*,\s*\d{4}",date_string)

【讨论】:

    【解决方案4】:
    import re
    my_string = "January 01, 1990\n By SomeAuthor"
    regex = re.compile('\w+\s+\d+, \d{4}')
    result = regex.search(my_string)
    

    结果将包含匹配的文本和字符范围。

    【讨论】:

      猜你喜欢
      • 2016-05-16
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多