gpt4 book ai didi

python - 如何在 Python 中获取字符串的原始表示形式?

转载 作者:太空狗 更新时间:2023-10-29 18:06:41 25 4
gpt4 key购买 nike

我正在创建一个严重依赖正则表达式的类。

假设我的类(class)是这样的:

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 软件基金会有一天改变了指定原始字符串文字的方式,我的代码将不会反射(reflect)这一点。不过,这是假设的。我主要关心的是这是否总是有效。不过,我想不出一个边缘案例。有更正式的方法吗?

编辑:Format Specification Mini-Language 中似乎没有任何内容, printf-style String Formatting guide ,或 string module .

最佳答案

原始字符串表示的问题在于,您无法以可移植(即不使用控制字符)的方式表示所有内容。例如,如果您的字符串中有一个换行符,您必须按字面意思将字符串换行到下一行,因为它不能表示为原始字符串。

也就是说,获取原始字符串表示的实际方法是您已经给出的:

"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'"'

关于python - 如何在 Python 中获取字符串的原始表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com