Python正则表达式任何子字符串匹配

2024-10-01 07:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想查找格式为18-05-201818-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。在


Tags: 方法字符串falsetrue格式模式findallggggg18
3条回答

我建议使用一个否定的lookbehind (?<!...),可以在正则表达式的任何一点插入它,以确保在该点之前出现的任何内容都与某个表达式(即...)匹配。在您的例子中,您希望确保紧靠表达式开头的内容与数字(\d)不匹配,因此您将在正则表达式的开头插入(?<!\d)。在

如果您还想排除末尾位数错误的匹配项,如aaaa18-05-181bbb,那么您还可以使用负lookahead (?!...),这与negative lookbehind类似,只不过它确保在某个点之后的与表达式不匹配。在您的例子中,为了确保数字不在匹配结束之后,您需要在表达式的末尾添加(?!\d)。在

一种方法是检查在日期匹配开始之前出现的内容是否是输入开头的非数字,以及日期匹配之后的内容是否也是输入的非数字或结尾。在

text = "sasdassdsadasdadas18-05-2018sdaq1213211214142"
matches = re.findall(r'(?:\D|^)(\d{1,2}[-]\d{1,2}[-]\d{2,4})(?:\D|$)', text)
print matches

['18-05-2018']

使用negativelookbehind和lookahead:

import re

s = 'sasdassdsadasdadas18-05-2018sdaq1213211214142'

print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))
# ['18-05-2018']

这可以确保在所需内容的开头或结尾没有尾随数字。在


要证明它能处理您的错误案例:

^{pr2}$

相关问题 更多 >