Python基础篇-字符串

2016-09-01 · 🙈Ray · 0条 · 381次

一、基本字符串操作

所有标准的序列操作(索引、分片、相加、乘法、成员资格、len、max、min),字符串同样适用。字符串是不可变的,所以分片赋值不行。

二、字符串格式化

>_ 基础知识

字符串格式化适用字符串格式化操作符(%)来实现。%也可以用作模运算操作符。

%左侧放置想要格式化的字符串,右边放置希望格式化的值。可以是一个字符串或者数字,也可以是多个值的元组或者字典。一般使用元组,其中的每一个元素都会被单独格式化,每一个值都需要一个对应的转换说明符。元组作为转换表达式的一部分的时候,必须用圆括号括起来,避免出错,例:”%s + %s = %s” % (1,1,2)

>>> letter = "hi, %s I promise you %s forever"

>>> info = ('liupeng',"I love u")

>>> letter % info

'hi, liupeng I promise you I love u forever'

如果使用列表或者其他序列替代元组,那么序列会被解释为一个值。只有元组和字典可以格式化一个以上的值。

格式化字符串的%s部分称为转换说明符(conversion specifier),标记了需要插入转换值的位置。S表示会被格式化为字符串,如果不是字符串,则会用str将其转换为字符串。

如果要在格式化字符串中包含%,需要使用%%,这样python就不会把%当作转换说明符了。

如果要格式化实数(浮点数),可以使用f指定转换说明符的类型,同时提供所需要的精度,一个句点加上希望保留的小数位数,放在类型符号f的前面。例:

>>> price = "the price is %.3f"

>>> p = 12.323223

>>> price % p

'the price is 12.323'

>_ 基本转换说明符

基本转换说明符包括:%字符,转换标识(可选),最小字段宽度(可选),点后跟精度值(可选),转换类型。与之对应的是完整的转换说明符,包括映射键的说明符,具体内容等字典部分的内容。

1.转换标识

-表示左对齐;+表示在转换值之前要加上正负号;“ ”(空格)表示正数之前保留空格;0表示转换值若位数不够用0填充。

2.最小字段宽度

转换后的字符串至少应该具有该值指定的宽度。如果是*,则值会从值元组中读出。

3.点后跟精度值

如果转换的是实数,精度值表示出现在小数点后的位数;如果转换的是字符串,那么该数字就表示最大字符宽度;如果是*,那么精度会从元组中读出。

4.转换类型

>_ 简单转换

简单转换只需要写出转换类型即可。例:

>>> s = "pi = %.5f..."

>>> from math import pi

>>> s % pi

'pi = 3.14159...'

>>> s = "Using repr %r"

>>> s % 42L

SyntaxError: invalid syntax

>>> s % 42l #报错了,似乎3支持长整数后L/l不好使了呀。那就别用了

SyntaxError: invalid syntax

>>> s % "hello"

"Using repr 'hello'"

>>> s = "Using str %s"

>>> s % "hello"

'Using str hello'

>_ 字段宽度和精度

最小字段宽度是转换后的值所保留的最小字符个数。精度对于小数来说是结果中应该包含的小数位数,对于字符串来说,是转换后的值所能包含的最大字符个数。

这两个值都是整数,首先是字段宽度,然后是精度,通过点号分隔。两个都是可选参数,但如果只给出精度,必须有点号。例:

>>> '%10.5s' % "我就想看看如果精度比最小宽度小会发生什么"

' 我就想看看'

可以使用*作为字段宽度或者精度(或者两者都使用),此时数值会从元组参数中读出:

>>> '%.*s' % "geek-era,com"

Traceback (most recent call last):

File "<pyshell#16>", line 1, in <module>

'%.*s' % "geek-era,com"

TypeError: * wants int

>>> '%.*s' % (5, "geek-era,com")

'geek-'

>_ 符号,对齐和用0填充

放置在字段宽度和精度之前。例:

>>> s = "%016.5f"

>>> s % pi

'0000000003.14159'

>>> s = "% 16.5f"

>>> s % pi

' 3.14159'

>>> s = "%-16.5f"

>>> s % pi

'3.14159 '

>>> s = "%+16.5f"

>>> s % pi

' +3.14159'

>>> s = "%-16.5s"

>>> s % "hello world"

'hello '

>>> s = "%+16.5s"

>>> s % "hello world"

' hello'

+号、0只对数值起作用,不对字符起作用。

空格表示在正数前加上一个空格,对于对齐正负数非常有用。例:

>>> print(('% 5d')%10 + "\n" + ('% 5d')%(-10))

10

-10

>_ 模板字符串

模板字符串是另外一种格式化字符串的方法。substitute这个模板方法会用传递进来的关键字参数foo替换字符串中的$foo。例:

>>> from string import Template

>>> s = Template($x, hi $x)

SyntaxError: invalid syntax

>>> s = Template('$x, hi $x')

>>> s.substitute(x = 'hello')

'hello, hi hello'

如果替换字符串是单词的一部分,那么参数名就必须用大括号{}括起来,用来准确指明结尾。例:

>>> s = Template('hello,${h}lo')

>>> s.substitute(h = 'hel')

'hello,hello'

可以使用$$插入美元符号,这跟%%是一样的。

除了关键字参数,还可以使用字典变量提供值/名称对。例:

>>> s = Template('say $something to $thegirl')

>>> lo = {} #字典

>>> lo['something'] = 'I love you'

>>> lo['thegirl'] = 'LiuPeng'

>>> s.substitute(lo)

'say I love you to LiuPeng'

方法safe_substitute不会因为缺少值或者不正确使用$字符而出错,缺少的值它会保留原格式。

>_ 字符串方法

字符串中的方法要比列表中的方法多得多。

1. find

在一个较长的字符串中查找子串,它返回子串所在位置的最左端索引,如果没有则返回-1.例:

>>> s = 'liupeng,where are you ?'

>>> s.find('liupeng')

0

>>> s.find('e')

4

find方法还可以接收可选的起始点和结束点参数。例:

>>> s = "I want build an excellent web, I want to be a amazing guy."

>>> s.find("want",5) #指定起始点

33

>>> s.find('want',5,30) #指定起始点和结束点

-1

在后两个参数指定的范围内中,包含第一个,不包含第二个,这在python中是一个惯例。

2. join

用来连接序列中的元素,需要被连接的序列都必须是字符串。例:

>>> '\\'.join(['software','data','book'])

'software\\data\\book'

>>> print('\\'.join(['software','data','book']))

software\data\book

3. lower

返回字符串的小写字母版。例:

>>> s = "GEEK-ERA.COM"

>>> s.lower()

'geek-era.com'

4. title

它会将字符串转换为标题——所有单词的首字母大写,其他字母小写。但是它使用的单词划分方法可能会得到并不自然的结果。例:

>>> s = "what's the fuck"

>>> s.title()

"What'S The Fuck"

类比------capwords函数(属于string模块)。例:

>>> s = "what's the fuck"

>>> import string

>>> string.capwords(s)

"What's The Fuck"

如果要得到正确首字母大写的标题(根据你的风格而定,可能要小写冠词、连词及5个字母以下的介词等),那么还是得自己把握。说白了,就是这些方法不准确呗,因为毕竟python的coder也不能把每个人会用到的标题样式都给你想全咯。

5. replace

查找并替换,返回某字符串的所有匹配项均被替换之后得到的字符串。

>>> s = 'what where and when'

>>> s.replace('wh','th')

'that there and then'

6. split

split用来将字符串分割成序列。与join是逆方法。例:

>>> s = '1+2+3+4+5+6'

>>> s.split('+')

['1', '2', '3', '4', '5', '6']

如果不提供任何分隔符,程序会把所有空格作为分隔符(空格、制表符、换行等)。

7. strip

返回去除两侧空格(不包括内部)的字符串。与lower方法一起使用的话可以很方便地对比输入的和存储的值。

也可以指定需要去除的字符,将这些字符作为参数即可。只能去除两侧的,中间的并不能去除。

>>> s = " **** !!! what * the * fu** ? *** !! "

>>> s.strip(' *!')

'what * the * fu** ?'

8. translate

translate方法和replace方法都可以替换字符串中的某些部分,但不同的是,translate方法只处理单个字符。优势在于可以同时进行多个替换,有时候比replace效率高得多。

在使用translate之前,需要先完成一张转换表。转化表中是以某字符替换某字符的对应关系。因为这个表(事实上是字符串,包含替换ASCII字符集中256个字符的替换字母的字符串)中有多达256个项目,我们可以借助string模块里的maketrans函数来实现(现在已经不行了,python高版本里已经不支持了)。maketrans函数接受两个参数:两个等长的字符串,第一个字符串中的字符都要用第二个字符串中对应的字符替换。例:

>>> from string import maketrans #大清亡啦

Traceback (most recent call last):

File "<pyshell#2>", line 1, in <module>

from string import maketrans

ImportError: cannot import name 'maketrans'

>>> table = "".maketrans('cs','kz')

>>> len(table)

2

>>> s = "cause i love you"

>>> s.translate(table)

'kauze i love you'

以前是一张256个字符的完整表,现在很明显不是了呀,表的长度是你指定的两个参数的长度(即该表中现在只有要改变的字符了)。

translate的第二个参数是可选的,用来指定需要删除的字符。

<_ _>特别地,对于非英语(3之后应该改为非unicode字符了)字符串的问题。

因为非英文字符的原因,有时候使得一些字符串方法不好使,比如字符串要转为小写,但该字符串中有很多非英文字符就不好使了。此时就可以使用translate方法来实现。

>>> s = 'PM贰.伍'

>>> s

'PM贰.伍'

>>> s.lower()

'pm贰.伍'

>>> table = "".maketrans('贰伍','25')

>>> s.translate(table)

'PM2.5'

>>> s.translate(table).lower()

'pm2.5'

对于unicode中存在的字符使用unicode字符串也可以解决问题(上面的例子是不好办了,因为有中文,只能用translate结合lower了),例如:

>>> 'ØPM'.lower()

'øpm'

>>> u'ØPM'.lower()

'øpm'

这里解释一下:在python3以前的版本中上面不用unicode字符串的时候是不行的,但现在的例子可以,是因为我的版本比较高,在新版本中,所有的字符串都默认是unicode字符串了。时代在进步啊!!!!

locale模块中也有一些国际化相关的功能。

>_ string模块

字符串方法完全来源于string模块,但是这个模块还包括一些不能作为字符串方法使用的常量和函数。下面介绍一些有用的字符串常量。

string.digits:包含数字0-9的字符串

string.letters:包含所有字母(大写或小写)的字符串,在3.0及以上版本,此常量和其相关内容被移除,如果需要应该使用string.ascii_letters常量代替。

string.lowercase:包含所有小写字母的字符串,(在3.0及以上,替换为string.ascii_lowercase)

string.printable:包含所有可打印字符的字符串

string.punctuation:包含所有标点的字符串

string.uppercase:包含所有大写字母的字符串,(在3.0及以上,替换为string.ascii_uppercase)


  0