rawstring表示的问题在于,您无法以可移植的方式(即,不使用控制字符)来表示所有内容。例如,如果您的字符串中有换行符,则必须将字符串从字面上断开到下一行,因为它不能表示为rawstring。
"r'{}'".format(regex.pattern)
rawstrings的定义是没有应用任何规则,只是它们以它们开头的引号结尾,并且您可以使用反斜杠转义该引号。因此,例如,您不能像"\"
原始字符串表示形式那样存储等效的字符串(r"\"
产生SyntaxError和r"\\"
yields"\\\\"
)。
如果您确实要执行此操作,则应使用类似以下的包装器:
def rawstr(s):
"""
Return the raw string representation (using r'') literals of the string
*s* if it is available. If any invalid characters are encountered (or a
string which cannot be represented as a rawstr), the default repr() result
is returned.
"""
if any(0 <= ord(ch) < 32 for ch in s):
return repr(s)
if (len(s) - len(s.rstrip("\\"))) % 2 == 1:
return repr(s)
pattern = "r'{0}'"
if '"' in s:
if "'" in s:
return repr(s)
elif "'" in s:
pattern = 'r"{0}"'
return pattern.format(s)
测试:
>>> test1 = "\\"
>>> test2 = "foobar \n"
>>> test3 = r"a \valid rawstring"
>>> test4 = "foo \\\\\\"
>>> test5 = r"foo \\"
>>> test6 = r"'"
>>> test7 = r'"'
>>> print(rawstr(test1))
'\\'
>>> print(rawstr(test2))
'foobar \n'
>>> print(rawstr(test3))
r'a \valid rawstring'
>>> print(rawstr(test4))
'foo \\\\\\'
>>> print(rawstr(test5))
r'foo \\'
>>> print(rawstr(test6))
r"'"
>>> print(rawstr(test7))
r'"'