我正在尝试编写同时验证dd-mm-yyyy
和dd-mm-yyyy hh:mm:ss
的正则表达式。
例如,
28-02-2018
和28-02-2018 03:30:55
应该由单个正则表达式正确验证。
到目前为止,我已经创建了两个单独的正则表达式,一个用于日期,另一个用于时间,我不知道如何将它们组合在一起以使其在两种情况下都适用。
dd-mm-yyyy,dd / mm / yyyy,dd.mm.yyyy-
^(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[\/\-\.]([12][0-9]\d\d)$
hh:mm:ss-
^(0?[0-9]|1[0-9]|2[0-3])[\:]([0-5][0-9])[\:]([0-5][0-9])$
我处理了错误的日期和月份数字。 years年对我来说不是问题。
我该怎么办?
答案 0 :(得分:1)
您可以添加一个可选零件...例如
^\d\d-\d\d-\d\d\d\d( \d\d:\d\d:\d\d)?$
意思是
^
字符串的开头\d\d
两位数字-
破折号\d\d-\d\d\d\d
再加上两位破折号和另外四位数(
子表达式的开头
空格\d\d:\d\d:\d\d
以99:99:99格式播放一次)
子表达式的结尾?
子表达式的零个或一个实例$
字符串的结尾在此示例中,?
用于使时间部分为“可选”。
如果您要接受不同的分隔符,但仅接受统一的案例(即拒绝12-03.2018),则可以使用稍微复杂一点的方法,例如:
^\d\d?([-./])\d\d?\1\d\d(\d\d)?( \d\d\:\d\d:\d\d)?$
^
字符串的开头\d\d?
一位或两位数([-./])
在-
,.
或/
\d\d?
一位或两位数\1
与我们之前使用的分隔符相同(对第1组的反向引用)\d\d(\d\d)?
两位或四位数字( \d\d:\d\d:\d\d)?
可选时间部分$
字符串的结尾答案 1 :(得分:1)
来自正则应用之——日期正则表达式,此正则表达式包含所有the年和月日。更改垫料格式后,答案应为:
^(?:(?:(?:(0[1-9]|1[0-9]|2[0-8])[\/\-\.](0[1-9]|1[0-2])|(29|30)[\/\-\.](0[13-9]|1[0-2])|(31)[\/\-\.](0[13578]|1[02]))[\/\-\.]([1-2][0-9]{3}))|(?:(29)[\/\-\.](02)[\/\-\.]([1-2][0-9](?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)))(?: ((?:[0-1][0-9])|(?:2[0-3])):([0-5][0-9]):([0-5][0-9]))?$
但是请注意,作者建议我们不要这样做。您最好编写正则表达式以匹配所有日期时间数字,然后通过代码对其进行验证。
答案 2 :(得分:0)
尝试一下,希望会有所帮助
import re
re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)
答案 3 :(得分:0)
我的建议如下:
(\d?\d[\/\.-]){2}\d{4}(\s\d{2}\:\d{2}\:\d{2})?
它与您所有的星座都匹配。
如果要验证日期,请使用dateutil.parser.parse()。像这样:
def is_valid_date(date_as_txt):
try:
parse(date_as_txt)
return True
except:
return False
对于有效日期,该函数返回True;对于无效日期,该函数返回False。
答案 4 :(得分:0)
您只需要在第一个表达式的末尾使用管道符号就可以包含第二个表达式。
IsOpen = true
结果:
IsOpen = false