Regex 如何将此函数更改为与Python 2和Python 3兼容?I';我遇到了字符串、unicode和其他问题
我有一个函数,旨在使文件名或URL的某些文本安全。我正在尝试对其进行更改,以使其在Python2和Python3中工作。在我的尝试中,我把自己和字节码搞混了,希望得到一些指导。我遇到了一些错误,比如序列项1:应该是像object一样的字节,str foundRegex 如何将此函数更改为与Python 2和Python 3兼容?I';我遇到了字符串、unicode和其他问题,regex,string,python-3.x,unicode,bytecode,Regex,String,Python 3.x,Unicode,Bytecode,我有一个函数,旨在使文件名或URL的某些文本安全。我正在尝试对其进行更改,以使其在Python2和Python3中工作。在我的尝试中,我把自己和字节码搞混了,希望得到一些指导。我遇到了一些错误,比如序列项1:应该是像object一样的字节,str found def slugify( text = None, filename = True, URL = False, return_str = True ): if
def slugify(
text = None,
filename = True,
URL = False,
return_str = True
):
if sys.version_info >= (3, 0):
# insert magic here
else:
if type(text) is not unicode:
text = unicode(text, "utf-8")
if filename and not URL:
text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore")
text = unicode(re.sub("[^\w\s-]", "", text).strip())
text = unicode(re.sub("[\s]+", "_", text))
elif URL:
text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore")
text = unicode(re.sub("[^\w\s-]", "", text).strip().lower())
text = unicode(re.sub("[-\s]+", "-", text))
if return_str:
text = str(text)
return text
似乎您的主要问题是,当您不确定原始类型是什么时,如何将文本转换为unicode并返回到字节。事实上,如果你小心的话,你不需要任何条件检查就可以做到这一点
if isinstance(s, bytes):
s = s.decode('utf8')
应该足以在Python2或Python3中将某些内容转换为unicode(通常假设2.6+和3.2+)。这是因为在Python 2中,字节作为字符串的别名存在。显式的utf8
参数仅在Python2中需要,但在Python3中提供它也没有坏处。然后,要转换回bytestring,只需执行相反的操作
if not isinstance(s, bytes):
s = s.encode('utf8')
当然,我建议您仔细想想,为什么您首先不确定字符串的类型。最好将区别分开,而不是编写“弱”API来接受这两种区别。Python3只是鼓励您保持分离。
不存在(s,字节)
总是正确的。您的意思是将s.decode('utf-8')
分配给第一个代码段中的s
以外的内容吗?@jwodder的想法是在代码段之间会有其他代码。我只是演示了如果您不知道现有类型,如何将某些内容转换为unicode或字节。