所以我试图解析一个文件,我有以下代码:
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”无法匹配这里发生了什么?
答案 0 :(得分: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中,str
和unicode
合并为单个str
类型,因此不需要这种区别。
答案 1 :(得分:1)
你的字符串中的Rhe em破折号是一个unicode字符,它将被解释为多个字符(3 in your case)。您的python版本不支持unicode,因此您需要匹配3个字符来捕获短划线.{3}
,在表达式中完全匹配字符,或者使用不同版本的python。
关于你的表达的一些注释;您应该始终在正则表达式字符串前加r'...'
前缀,以便正确解释\
转义符。
正则表达式中的.
具有特殊含义,它将匹配任何单个字符。如果您需要句点/小数点,则需要转义点\.
。
pattern = re.compile(r'[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3} .')