2016-10-04 3 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 - 」と一致します。しかし、私がもう一人のキャラクターを追加すると、それは機能しません。ここで何が起こっている - それはこれが「C 01.123:01 01」と一致しなかった

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 

だように、例えば、私は私のコードを編集する場合は?

+1

正規表現内の '.'は任意の文字を意味します。 '.'とマッチさせるには正規表現で' \ .'を使います。 –

+0

@ShriroopJoshi:*任意の*文字と一致する場合、論理的には1つの完全停止に一致する必要があります。 – usr2564301

+0

この例では、最初のドットをエスケープしても何も解決されません。 – revo

答えて

4

問題は - がユニコード文字であることです。

>>> print len('—') 
3 

しかし、あなたの代わりにstrunicode使用する場合: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は1つのstrタイプにマージされるため、この区別は必要ありません。

1

文字列内の文字列はユニコード文字で、複数の文字として解釈されます(3 in your case)。お使いのPythonのバージョンはユニコード対応ではありませんので、.{3}をキャプチャするには3文字をマッチさせ、文字列を正確に一致させたり、別のバージョンのPythonを使用する必要があります。

あなたの表現に関するいくつかの注釈。 \のエスケープが正しく解釈されるように、正規表現の文字列には常にr'...'が付いていなければなりません。

正規表現の.は特別な意味を持ち、任意の1文字と一致します。ピリオド/小数点が必要な場合は、ドット\.をエスケープする必要があります。

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

こんにちは、答えるおかげで、私はそれを認識しています。任意の1文字に一致します。私は長いダッシュに対処するためにそれを使用しています。しかし、私の編集したコードが "01:01:01.123 - C"とまだ一致するべきではないのですか? –

+4

この回答は本当にこの問題の解決策を提供していません。 – revo

+0

問題は、文字列 '.'にマッチするだけの式は、他の文字とマッチしているということではなく、逆です。一致するはずの式はそうしていないので...またはOPは言う。それは私のためにうまく動作します。 – TigerhawkT3