You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含反斜杠的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:20:51