我想以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
。
答案 0 :(得分:2)
使用负值向后看并向前看:
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']
这可以确保在所需内容的开头或结尾处没有结尾数字。
要证明它可以处理您的错误情况:
import re
s = 'sasdassdsadasdadas2018-05-2018sdaq1213211214142'
print(re.findall(r'(?<!\d)\d{1,2}[-]\d{1,2}[-]\d{2,4}(?!\d)', s))
# []
答案 1 :(得分:1)
一种方法是检查日期匹配开始之前出现的是输入开始的非数字,日期匹配之后出现的也是数字还是输入的结束。
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 :(得分:0)
我建议在(?<!...)
后使用负数查找,您可以在正则表达式的任何位置插入它,以确保该点之前出现的所有内容不匹配 (...
)。在您的情况下,您要确保表达式开头之前的内容与数字(\d
)不匹配,因此您可以在正则表达式的开头插入(?<!\d)
。>
如果您还想排除末尾具有错误数字位数的匹配项(例如aaaa18-05-181bbb
),则还可以使用否定的前瞻性(?!...)
,这与后面的否定性相似除了可以确保在之后出现的某点与表达式不匹配。对于您而言,为确保比赛结束后不出现数字,请在表达式的末尾添加(?!\d)
。
答案 3 :(得分:0)
您可以使用负向后看和负向前看来断言左侧和右侧没有数字。要在末尾匹配2或4位数字,您可以使用交替:
(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)
import re
str = 'ggggg18-05-2018ggggg12345678'
print(re.findall(r'(?<!\d)\d{2}-\d{2}-(?:\d{4}|\d{2})(?!\d)', str))
请注意,您可以在不使用字符类的情况下使用连字符。