如何在Python中小写字符串?

遇到的问题:

有没有一种方法可以将字符串从大写字母甚至部分大写字母转换为小写字母?

例如,“公里”→“公里”。

解决方案:

解决方案一

使用.lower() -例如:

 s = "Kilometer"
print(s.lower()) 

官方2.x文档在这里: str.lower()
正式的3.x文档在这里: str.lower()

解决方案二

如何在Python中将字符串转换为小写?

有什么办法可以将整个用户输入的字符串从大写甚至部分大写转换为小写?

例如公里->公里

规范的Python方式是

 >>> 'Kilometers'.lower()
'kilometers' 

但是,如果目的是进行不区分大小写的匹配,则应使用大小写折叠:

 >>> 'Kilometers'.casefold()
'kilometers' 

原因如下:

 >>> "Maße".casefold()
'masse'
>>> "Maße".lower()
'maße'
>>> "MASSE" == "Maße"
False
>>> "MASSE".lower() == "Maße".lower()
False
>>> "MASSE".casefold() == "Maße".casefold()
True 

这是Python 3中的str方法,但是在Python 2中,您需要查看PyICU或py2casefold- 几个答案在这里解决

Unicode Python 3

Python 3将纯字符串文字处理为unicode:

 >>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр' 

Python 2,纯字符串文字是字节

在Python 2中,将以下内容粘贴到外壳中,然后使用utf-8将文字编码为字节字符串。

而且lower不会映射字节会知道的任何更改,因此我们得到相同的字符串。

 >>> string = 'Километр'
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.lower()
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.lower()
Километр 

在脚本中,Python将反对非ascii(从Python 2.5开始,在Python 2.4中为警告)字节,该字节位于未给出编码的字符串中,因为预期的编码将是模棱两可的。 有关更多信息,请参阅文档PEP 263中的Unicode操作方法。

使用Unicode文字,而不是str文字

因此,我们需要一个unicode字符串来处理此转换,只需使用unicode字符串文字即可轻松完成此操作,该字符串可使用u前缀消除歧义(请注意, u前缀在Python 3中也适用):

 >>> unicode_literal = u'Километр'
>>> print(unicode_literal.lower())
километр 

请注意,这些字节与str字节完全不同-转义字符为'\u'后跟2个字节的宽度或这些unicode字母的16位表示形式:

 >>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440' 

现在,如果仅以str形式使用它,则需要将其转换为unicode Python的Unicode类型是一种通用编码格式,相对于大多数其他编码而言,它具有许多优点 我们可以在编解码器中使用unicode构造函数或str.decode方法,将str转换为unicode

 >>> unicode_from_string = unicode(string, 'utf-8') # "encoding" unicode from string
>>> print(unicode_from_string.lower())
километр
>>> string_to_unicode = string.decode('utf-8') 
>>> print(string_to_unicode.lower())
километр
>>> unicode_from_string == string_to_unicode == unicode_literal
True 

两种方法都转换为unicode类型-并与unicode_literal相同。

最佳做法,使用Unicode

建议始终使用Unicode文本

软件应仅在内部使用Unicode字符串,并在输出时转换为特定的编码。

必要时可以回编码

但是,要恢复为str类型的小写字母,请再次将python字符串编码为utf-8

 >>> print string
Километр
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.decode('utf-8')
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower().encode('utf-8')
'\xd0\xba\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.decode('utf-8').lower().encode('utf-8')
километр 

因此,在Python 2中,Unicode可以编码为Python字符串,而Python字符串可以解码为Unicode类型。

解决方案三

对于Python 2,这不适用于UTF-8中的非英语单词。 在这种情况下, decode('utf-8')可以帮助您:

 >>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр 
阅读 434 次发布于 2019年12月23日
推荐阅读
为什么处理排序数组要比处理未排序数组快?

这是一段C ++代码,显示了一些非常特殊的行为。 出于某些奇怪的原因,奇迹般地对数据进行排序使代码快了将近六倍: #include #include #include int main() { // Generate data const unsigned arraySize = 32768; int da...

2019-12-20 阅读 18

如何撤消Git中的最新本地提交?

我不小心将错误的文件提交给Git ,但是我还没有将提交推送到服务器。 如何撤消本地存储库中的那些提交?

2019-12-20 阅读 31

如何在本地和远程删除Git分支?

我想在本地和远程删除分支。 尝试删除远程分支失败 $ git branch -d remotes/origin/bugfix error: branch 'remotes/origin/bugfix' not found. $ git branch -d origin/bugfix error: branch 'origin/bugfix' not found. $ git branch ...

2019-12-20 阅读 21

'git pull'和'git fetch'有什么区别?

主持人注意:鉴于此问题已经发布了67个答案 (其中一些已删除),请在发布另一个问题之前考虑您是否正在贡献新内容 。 git pull和git fetch什么区别?

2019-12-20 阅读 23

什么是正确的JSON内容类型?

我一直在弄乱JSON一段时间,只是将其作为文本推出,并没有伤害任何人(据我所知),但是我想正确地做事。 我已经看到许多所谓的JSON内容类型的“标准”: application/json application/x-javascript text/javascript text/x-javascript text/x-json 但是哪一个是正确的,还是最好的? 我发现在它们之间存在安全性和浏览...

2019-12-20 阅读 30

目录