含反斜杠的Doctest结果异常:Pytest行为原因及解决方法
问题原因
这不是Pytest的特殊处理,而是Python字符串的转义机制导致的:
- 在普通字符串(包括函数的docstring)中,
\\会被Python解释器解析为单个\。你写在测试用例里的"c:\\abcDEF1 23-_@.sql",实际被解析后变成了"c:\abcDEF1 23-_@.sql"。 - 这里的
\a是ASCII转义字符(对应响铃控制字符,ASCII码0x07),不是字面意义的\加a。函数实际接收到的输入是"c:\x07bcDEF1 23-_@.sql",而你的正则表达式不允许控制字符,所以\x07被替换为空,最终输出变成'c:bcDEF1 23-_.sql',和预期不符。
解决方案
有三种可行的修改方式,任选其一即可:
方式1:使用原始字符串标记r
在测试用例的字符串前加上r,让Python把字符串当作原始字符串处理,跳过转义字符解析:
def strip_special_chars(input_text, re_string='[^a-zA-Z0-9_\s\.\-:\\\\]'): """ >>> strip_special_chars(r"c:\abcDEF1 23-_@.sql") r'c:\abcDEF1 23-_.sql' """ regex = re.compile(re_string) return regex.sub('', input_text)
注意:预期结果也可以用
r标记,或者保持普通字符串但写双反斜杠('c:\\abcDEF1 23-_.sql'),两种写法都能匹配正确结果。
方式2:在普通字符串中用四个反斜杠表示单个字面反斜杠
因为普通字符串里\\\\会被解析为\\,传入函数后又会被解析为单个\,以此保留字面意义的反斜杠:
def strip_special_chars(input_text, re_string='[^a-zA-Z0-9_\s\.\-:\\\\]'): """ >>> strip_special_chars( "c:\\\\abcDEF1 23-_@.sql") 'c:\\\\abcDEF1 23-_.sql' """ regex = re.compile(re_string) return regex.sub('', input_text)
方式3:将整个docstring定义为原始字符串
用r"""..."""包裹整个函数的docstring,这样里面的所有转义字符都不会被解析:
def strip_special_chars(input_text, re_string='[^a-zA-Z0-9_\s\.\-:\\\\]'): r""" >>> strip_special_chars(r"c:\abcDEF1 23-_@.sql") r'c:\abcDEF1 23-_.sql' """ regex = re.compile(re_string) return regex.sub('', input_text)
内容的提问来源于stack exchange,提问作者Jason O.
相关产品推荐
相关产品推荐

