所以我有一个日期字段(YYYY / DD / MM)
print len(allInOne), "bytes"
print len(allInOne) + allInOne.count('\n'), "bytes with 0A counted twice"
和
(YYYY / MM / DD)
^((\d{4}|\d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/])(0?[1-9]|1[012])$
我想知道我是否可以将DD和MM部件互换,以便我不单独代表它们。我知道我可以在YYYY之后使用OR函数,但我真的希望有一个能够以最短模式捕获这两种格式的正则表达式。
答案 0 :(得分:0)
最简单的方法是使用regex1和regex2并将它们拼凑在一起:
regex1|regex2
然后,您可以提取相互"前缀"和"后缀"。在你的情况下:
^(\d{4}|d{2})[-/]
和$
这里我使用?|
分支重置:
^(\d{4}|\d{2})[-/](?|(0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12][0-9]|3[01]))$
假设\d
与[0-9]
相同,您可以缩短一点:
^(\d{4}|\d{2})[-/](?|(0?[1-9]|[12]\d|3[01])[-/](0?\d|1[012])$|(0?[1-9]|1[012])[-/](0?[1-9]|[12]\d|3[01]))$
这最贴近您的原始正则表达式。
另一方面,您可能想要放弃一些验证。与当天匹配的部分也将匹配所有月份。
这个正则表达式:
^(\d{4}|\d{2})[-/](0?[1-9]|[12][0-9]|3[01])[-/](0?[1-9]|[12][0-9]|3[01])$
如果您不关心捕获群组(因为在[-/]
上分割是微不足道的),您可以使用:
^(\d{4}|\d{2})([-/](0?[1-9]|[12][0-9]|3[01])){2}$
它将匹配旧正则表达式匹配的所有内容。缺点是它也匹配"日期"像:
2000/31/30
当然,最短的正则表达式(在合理范围内;否则它是.*
)将是这样的:
^(\d{2}){1,2}([-/]\d{1,2}){2}$