2016-10-04 4 views
4

Так что я пытаюсь разобрать через файл и у меня есть следующий код:Regular Expression Dot не работает

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

'.' В регулярных выражениях означает любой символ. Чтобы соответствовать '.' use' \ .' в вашем регулярном выражении. –

+0

@ShriroopJoshi: но если он соответствует * любому символу *, то логически он должен также соответствовать одной полной остановке. – usr2564301

+0

В этом примере экранирование первой точки ничего не решает. – revo

ответ

4

Проблема в том, что ваш - символ юникода. Когда в 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, str и unicode объединены в один тип str, и поэтому это различие не требуется.

1

Rhe em штрих в вашей строке является символом юникода, который будет интерпретироваться как несколько символов (3 in your case). Ваша версия python не поддерживается в формате unicode, поэтому вам нужно будет либо сопоставить 3 символа, чтобы захватить .{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