2016-10-04 123 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