用于查找日期子字符串的正则表达式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可以避免无意义地捕获匹配两次)。