我想查找格式为18-05-2018
和18-05-18
,但不是2018-05-18
。我想使用正则表达式,这样当这样的日期出现在字符串中时,我得到True
。在
因此它应该为这些字符串返回True
:
ggggg18-05-2018ggggg
ggggg18-05-2018ggggg12345678
ggggg18-05-18ggggg
ggggg18-05-18ggggg12345678
但对于这些字符串,它应该返回False
:
ggggg2018-05-18ggggg
ggggg2018-05-18ggggg12345678
怎么做?我找到了findall()
方法和模式'\d{1,2}[-]\d{1,2}[-]\d{2,4}'
,但它返回了最后两个字符串的True
,因为它在其中找到了18-05-18
。在
我建议使用一个否定的lookbehind
(?<!...)
,可以在正则表达式的任何一点插入它,以确保在该点之前出现的任何内容都与某个表达式(即...
)匹配。在您的例子中,您希望确保紧靠表达式开头的内容与数字(\d
)不匹配,因此您将在正则表达式的开头插入(?<!\d)
。在如果您还想排除末尾位数错误的匹配项,如
aaaa18-05-181bbb
,那么您还可以使用负lookahead(?!...)
,这与negative lookbehind类似,只不过它确保在某个点之后的与表达式不匹配。在您的例子中,为了确保数字不在匹配结束之后,您需要在表达式的末尾添加(?!\d)
。在一种方法是检查在日期匹配开始之前出现的内容是否是输入开头的非数字,以及日期匹配之后的内容是否也是输入的非数字或结尾。在
使用negativelookbehind和lookahead:
这可以确保在所需内容的开头或结尾没有尾随数字。在
要证明它能处理您的错误案例:
^{pr2}$相关问题 更多 >
编程相关推荐