Python字符串模式匹配不起作用

时间:2017-01-26 15:43:00

标签: python regex

在这个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")

2 个答案:

答案 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”。s1s2变量可写为

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"