![](/img/trans.png)
[英]Python 3: How do I get a string literal representation of a byte string?
[英]How do I get the raw representation of a string in Python?
我正在创建一个严重依赖正则表达式的类。
让我们说我的课看起来像这样:
class Example:
def __init__(self, regex):
self.regex = regex
def __repr__(self):
return 'Example({})'.format(repr(self.regex.pattern))
让我们说我像这样使用它:
import re
example = Example(re.compile(r'\d+'))
如果我做repr(example)
,我得到'Example('\\\\\\\\d+')'
,但我想要'Example(r'\\\\d+')'
。 考虑到打印时的额外反斜杠,它显示正确。 我想我可以实现它来返回"r'{}'".format(regex.pattern)
,但这并不适合我。 万一Python软件基金会有一天会改变指定原始字符串文字的方式,我的代码就不会反映出来。 不过,这是假设的。 我主要担心的是这是否一直有效。 不过,我无法想到一个优势的边缘情况。 有更正式的方法吗?
编辑: 格式规范迷你语言 , printf
样式字符串格式指南或string
模块似乎没有出现。
rawstring表示的问题是,您不能以便携式(即不使用控制字符)的方式表示所有内容。 例如,如果你的字符串中有一个换行符,你必须将字符串分解为下一行,因为它不能表示为rawstring。
也就是说,获取rawstring表示的实际方法就是你已经给出的:
"r'{}'".format(regex.pattern)
rawstrings的定义是没有应用任何规则,除了它们以它们开头的引号字符结束,并且你可以使用反斜杠转义所述引号字符。 因此,例如,您不能在原始字符串表示中存储类似"\\"
的字符串的等价物( r"\\"
产生SyntaxError, r"\\\\"
产生"\\\\\\\\"
)。
如果你真的想这样做,你应该使用一个包装器,如:
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'"'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.