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))