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

Python正则表达式-任何子字符串匹配,python,regex,Python,Regex,我想以18-05-2018和18-05-18的格式查找日期,但不是2018-05-18。我想使用正则表达式,这样当这样的日期出现在字符串中时,我就可以得到True 因此,对于这些字符串,它应该返回True: GGGGG 18-05-2018GGGGGGG GGGGG 18-05-2018ggggg12345678 ggggg 18-05-18ggggg ggggg18-05-18ggggg12345678 但是对于这些字符串,它应该返回False: GGGGG 2018-05-18gggg

我想以
18-05-2018
18-05-18
的格式查找日期,但不是
2018-05-18
。我想使用正则表达式,这样当这样的日期出现在字符串中时,我就可以得到
True

因此,对于这些字符串,它应该返回
True

  • GGGGG 18-05-2018GGGGGGG
  • GGGGG 18-05-2018ggggg12345678
  • ggggg 18-05-18ggggg
  • ggggg18-05-18ggggg12345678
但是对于这些字符串,它应该返回
False

  • GGGGG 2018-05-18ggggg
  • GGGGG 2018-05-18ggggg12345678
怎么做?我找到了
findall()
方法和模式
'\d{1,2}[-]\d{1,2}[-]\d{2,4}'
,但它对最后两个字符串返回了
True
,因为它在其中找到了
18-05-18

使用负后向和前向查找:

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']
重新导入
s='SASDASSDAS18-05-2018SDAQ12131214142'

print(re.findall(r’(?我建议使用反向查找
(?),您可以在正则表达式中的任何点插入它,以确保该点之前的任何内容都与特定表达式不匹配(
)。在您的情况下,您希望确保表达式开头之前的内容与数字(
\d
)不匹配,因此您将在正则表达式开头插入
(?)


如果您还希望排除结尾位数错误的匹配项,如
aaaaaa18-05-181bbb
,则也可以使用负前瞻
(?!…)
,它类似于反向查找,只是它确保某个点后面的数字与表达式不匹配。在您的情况下,为了确保数字不在匹配结束后,您需要添加
(?!\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']

您可以使用负向后看和负向前看来声明左侧和右侧没有数字。要匹配结尾处的2或4个数字,您可以使用替换:

重新导入
str='GGGGG 18-05-2018ggggg12345678'

print(关于findall(r')(?它应该返回什么,例如
2018-12-12
01.01.01-01-01
?对于包含两种格式日期的字符串,例如
ggg18-05-18gggg2018-05-18ggg
,如果有一种格式匹配,它应该返回true
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']
import re
str = 'ggggg18-05-2018ggggg12345678'
print(re.findall(r'(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)', str))