正则表达式Dot不起作用

时间:2016-10-04 21:17:52

标签: python regex python-2.7

所以我试图解析一个文件,我有以下代码:

def learn_re(s):
pattern=re.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} .")
if pattern.match(s):
    return True
return False

这与“01:01:01.123 - ”匹配;但是,当我添加一个字符时,它无法工作。例如,如果我编辑我的代码,那么它就是

def learn_re(s):
pattern=re.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} . C")
if pattern.match(s):
    return True
return False

这与“01:01:01.123 - C”无法匹配这里发生了什么?

2 个答案:

答案 0 :(得分:4)

问题是你的 - 是一个unicode角色。在str中,它实际上表现得更像几个字符:

>>> print len('—')
3

但是,如果您使用的是unicode而不是str

>>> print len(u'—')
1

因此,以下内容将打印True

def learn_re(s):
    pattern=re.compile("[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3} . C")
    if pattern.match(s):
        return True
    return False

print learn_re(u"01:01:01.123 — C")

请注意,此行为特定于python 2.在python 3中,strunicode合并为单个str类型,因此不需要这种区别。

答案 1 :(得分:1)

你的字符串中的Rhe em破折号是一个unicode字符,它将被解释为多个字符(3 in your case)。您的python版本不支持unicode,因此您需要匹配3个字符来捕获短划线.{3},在表达式中完全匹配字符,或者使用不同版本的python。

关于你的表达的一些注释;您应该始终在正则表达式字符串前加r'...'前缀,以便正确解释\转义符。

正则表达式中的.具有特殊含义,它将匹配任何单个字符。如果您需要句点/小数点,则需要转义点\.

pattern = re.compile(r'[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3} .')