在这个python字符串模式匹配中,我想过滤掉s1,它应该像* \ 2017-01-23 \,日期字符串后跟一个' \' 。任何的想法?
s1="historyData\xx\n3_1010366372_2017-01-25_1126807";
s2="historyData\xx\2017-01-23\n3_1010366372_2017-01-25_1126807";
date_reg_exp = re.compile('\d{4}[-/]\d{2}[-/]\d{2}\\');
mat = re.match(date_reg_exp, s)
if mat is not None:
print("not matched")
else:
print("matched")
答案 0 :(得分:1)
您必须使用原始字符串而不是字符串。因为\xx
不是公认的字符。
a = "\xx"
会抛出ValueError: invalid \x escape
你可以尝试这样:
import re
s1 = r"historyData\xx\n3_1010366372_2017-01-25_1126807"
s2 = r"historyData\xx\2017-01-23\n3_1010366372_2017-01-25_1126807"
s = r"(?:.*?\\)(\d+-\d+-\d+)(?:\\.*)$"
reg = re.compile(s)
print re.match(reg, s1)
print re.match(reg, s2).group(1)
输出:
None
2017-01-23
答案 1 :(得分:1)
您必须使用search
代替match
以下是doc所说的
Python提供了两种基于常规的基本操作 表达式:re.match()仅在开头检查匹配 字符串,而re.search()检查匹配中的任何位置 string(这是Perl默认执行的操作)。
提供的字符串无效\x
转义。要将它们用作行字符串,您可以使用r“string”。s1
和s2
变量可写为
s1=r"historyData\xx\n3_1010366372_2017-01-25_1126807"
s2=r"historyData\xx\2017-01-23\n3_1010366372_2017-01-25_1126807"
您可以按如下方式重新编写该功能。
import re
def containsDate(s):
date_reg_exp = re.compile(r'(\d{4}-\d{2}-\d{2})')
mat = re.search(date_reg_exp,s)
return mat is not None
现在可以按如下方式使用这些功能
s1=r"historyData\xx\n3_1010366372_2017-01-25_1126807"
s2=r"historyData\xx\2017-01-23\n3_1010366372_2017-01-25_1126807"
if containsDate(s1):
print "match"
else:
print "no match"