2016-10-04 101 views
4

所以我想通过一个文件来分析,我有以下代码:正则表达式点不工作

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”这里发生了什么?

+1

正则表达式中的'.'表示任何字符。在你的正则表达式中匹配'.'使用'\ .'。 –

+0

@ShriroopJoshi:但如果它匹配*任何*字符,那么逻辑上它也应该匹配一个句号。 – usr2564301

+0

在这个例子中,转义第一个点并不能解决任何问题。 – revo

回答

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

在您的字符串中流行的是一个unicode字符,它将被解释为多个字符(3 in your case)。您的python版本不支持unicode,因此您需要匹配3个字符来捕获破折号,在您的表达式中准确匹配字符,或使用不同版本的python。

关于你的表情的一些注意事项;您应该始终在正则表达式字符串前加上r'...',这样您的\转义将被正确解释。

A .在正则表达式中有特殊含义,它会匹配任何单个字符。如果您需要周期/小数点,则需要转义点\.

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

嗨,感谢您的回答,但我知道这一点。将匹配任何单个字符。我用它来处理长冲刺。但是,我编辑的代码是否仍然与“01:01:01.123 - C”匹配? –

+4

这个答案确实没有提供这个问题的解决方案。 – revo

+0

问题不在于表达意图只匹配一个文字'.'也是匹配其他字符 - 这是相反的。应该匹配的表达方式不是这样做......或者说OP说。这对我来说可以。 – TigerhawkT3