正则表达式点不工作
所以我想通过一个文件来分析,我有以下代码:正则表达式点不工作
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”这里发生了什么?
问题是你的 - 是一个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中,str
和unicode
被合并成一个str
类型,所以这种区别不是必需的。
在您的字符串中流行的是一个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} .')
嗨,感谢您的回答,但我知道这一点。将匹配任何单个字符。我用它来处理长冲刺。但是,我编辑的代码是否仍然与“01:01:01.123 - C”匹配? –
这个答案确实没有提供这个问题的解决方案。 – revo
问题不在于表达意图只匹配一个文字'.'也是匹配其他字符 - 这是相反的。应该匹配的表达方式不是这样做......或者说OP说。这对我来说可以。 – TigerhawkT3
正则表达式中的'.'表示任何字符。在你的正则表达式中匹配'.'使用'\ .'。 –
@ShriroopJoshi:但如果它匹配*任何*字符,那么逻辑上它也应该匹配一个句号。 – usr2564301
在这个例子中,转义第一个点并不能解决任何问题。 – revo