用于查找日期子字符串的正则表达式Python 3.7

用于查找日期子字符串的正则表达式Python 3.7,python,regex,python-3.x,Python,Regex,Python 3.x,我正试图编写一个正则表达式来查找字符串中的特定子字符串 我正在寻找以下格式的日期: “2018年1月1日” 我已经做了一些研究,但还没有弄清楚如何为我的具体案例生成正则表达式 我的正则表达式的当前版本是 re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string) 我对正则表达式相当缺乏经验,但通过阅读文档,这是我能想到的,因为它与我正在使用的日期格式相匹配 下面是我在正则表达式背后的思考过程: \w应与任何unicode单词字符匹配,*应重复上一个匹配,因此这

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

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

“2018年1月1日”

我已经做了一些研究,但还没有弄清楚如何为我的具体案例生成正则表达式

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

re.search("[\w*?\s\d\d\s\d\d\d\d]", my_string)
我对正则表达式相当缺乏经验,但通过阅读文档,这是我能想到的,因为它与我正在使用的日期格式相匹配

下面是我在正则表达式背后的思考过程:

\w
应与任何unicode单词字符匹配,
*
应重复上一个匹配,因此这些字符应一起与类似“一月”的内容匹配
使*不贪婪,因此它不会尝试以
1月20日的形式匹配任何内容,因为它应该在第一个空格字符处停止

\s
应匹配空白

\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}

试一下

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'>
[992]中的
:my_string=“1990年1月1日\n作者”
…:打印(重新搜索(“[A-Z][A-Z]+\s+\d{1,2}、\s+\d{4}”,我的字符串))
...:
  • [A-Z]
    是任何大写字母
  • [a-z]+
    是一个或多个小写字母
  • \s+
    是一个或多个空格字符
  • \d{1,2}
    至少为1位,最多为2位
  • 试一试

    [992]中的
    :my_string=“1990年1月1日\n作者”
    …:打印(重新搜索(“[A-Z][A-Z]+\s+\d{1,2}、\s+\d{4}”,我的字符串))
    ...:
    
  • [A-Z]
    是任何大写字母
  • [a-z]+
    是一个或多个小写字母
  • \s+
    是一个或多个空格字符
  • \d{1,2}
    至少为1位,最多为2位
  • 在这里:

    在这里:

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


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

    您的模式在某些方面可能有点贪婪,例如在月份名称中。此外,您还缺少可选的逗号。最后,您可以使用ignorecase标志简化模式。下面是一个在详细模式下使用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
    

    您的模式在某些方面可能有点贪婪,例如在月份名称中。此外,您还缺少可选的逗号。最后,您可以使用ignorecase标志简化模式。下面是一个在详细模式下使用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
    

    你根本不匹配逗号…哦,我完全错过了,谢谢你指出这一点。
    print(re.search(r'\w*\s\d{1,2},\s\d{2,4},my_string.).group()
    它起作用了…家乐福括号中的空格和逗号添加你根本不匹配逗号…哦,我完全错过了,谢谢你指出这一点。
    print(re.search(r'\w*\s\d{1,2}、\s\d{2,4},我的字符串).group()
    它可以工作…家乐福用括号中的空格和逗号来添加
    \d\d?
    ,而不是
    \d{2}
    …一个月的哪一天可能只有一个数字,而且
    \w
    对这个问题也不是很好(它还将匹配数字,我们更可能只想匹配字母顺序)此外,您可能希望在逗号周围添加可选空格。注意
    \w
    还匹配数字和下划线。而且您几乎肯定要使用单词边界标记,因此您不需要在字符串
    12345
    中匹配
    1234
    ,甚至
    1234abcd
    。为了安全起见,您需要使用原始字符串文字(因为除此之外,
    \b
    表示退格,而不是单词边界),使其成为
    r“\b\w+\s+\d{1,2}、\s+\d{4}\b”
    使用
    \d\d?
    ,而不是
    \d{2}
    。一个月的哪一天可能只有一个数字,而且
    \w
    对这个问题也不是很好(它还将匹配数字,我们更可能只想匹配字母顺序)此外,您可能希望在逗号周围添加可选空格。注意
    \w
    还匹配数字和下划线。而且您几乎肯定要使用单词边界标记,因此您不需要在字符串
    12345
    中匹配
    1234
    ,甚至
    1234abcd
    。为了安全起见,您需要使用原始字符串文字(因为除此之外,
    \b
    表示退格,而不是单词边界),使其成为
    r“\b\w+\s+\d{1,2}、\s+\d{4}\b”
    不需要捕捉括号;Python match对象已经捕捉到匹配的文本,因此您的代码在没有括号的情况下仍能正常工作(省略括号可以避免无意义地捕捉匹配的两次)。不需要捕获括号;Python match对象已经捕获了匹配的文本,因此您的代码在没有paren的情况下可以正常工作(省略paren可以避免无意义地捕获匹配两次)。