猿问

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

我想在格式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在其中找到的那样。


慕村9548890
浏览 226回答 3
3回答

肥皂起泡泡

使用负向后视和前视:import res = 'sasdassdsadasdadas18-05-2018sdaq1213211214142'print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))# ['18-05-2018']这可确保在所需内容的开头或结尾没有尾随数字。为了证明它处理您的错误情况:import res = 'sasdassdsadasdadas2018-05-2018sdaq1213211214142'print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))# []

阿晨1998

一种方法是检查日期匹配开始之前的内容是否是输入开头的非数字,日期匹配之后的内容也是非数字或输入的结尾。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']

白猪掌柜的

您可以使用负后视和负前瞻来断言左侧和右侧没有数字。要匹配最后的 2 或 4 位数字,您可以使用交替:(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)正则表达式演示import restr = 'ggggg18-05-2018ggggg12345678'print(re.findall(r'(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)', str))请注意,您可以在没有字符类的情况下使用连字符。演示 Python
随时随地看视频慕课网APP

相关分类

Python
我要回答