8.字符串操作

1.原始字符串

可以在字符串开始的引号之前加上r, 使它成为原始字符串。“原始字符串”完全忽略所有的转义字符,打印出字符串中能够所有的到斜杠, 例如:
>>>print(r'That is Carol\'s cat.')
That is Carol\'s cat.
因为这是原始字符串, Python认为倒斜杠是字符串的一部分,而不是转义字符的开始, 如果输入的字符串有很多的倒斜杠,
比如正则表达式字符串, 那么原始字符串就很有用了。

2.用三重引号的多行字符串

虽然可以用\n转义字符将换行放入一个字符串, 但是用多行字符串通常更容易。 在Python中, 多行字符串的起止是3个单引号或3个双引号。“三重引号”之间
的所有引号、制表符或换行, 都被认为是字符串的一部分。 Python的代码块缩进规则不适用于多行字符串。
>>> print('''Dear Alice,)
Eve's cat has been arrested for catnapping, cat burglary, and extortion.

Sincerely,
Bob''')
Dear Alice,)
Eve's cat has been arrested for catnapping, cat burglary, and extortion.

Sincerely,
Bob

3.多行注释

虽然'#'可以表示这一行是注释, 但多行字符串常常用作多行注释。

4.字符串下标和切片

字符串像列表一样, 使用下标和切片。 可以将字符串‘Hello world!’看成是一个列表, 字符串的每一个字符都是一个表项, 有对应的下标。
H  e  l  l  o     w  o  r  l  d   !
0  1  2  3  4  5  6  7  8  9  10  11
>>> spam = 'Hello world!'
>>> spam[0]
'H'
>>> spam[4]
'o'
>>> spam[-1]
'!'
>>> spam[:5]
'Hello'
>>> spam[6:]
'world!'
如果指定一个下标, 你将得到字符串在该处的字符, 如果用一个下标和另一个下标指定一范围, 开始下标被包含, 结束下标则不包含。
请注意, 字符串切片并没有修改原来的字符串, 可以从一个变量中获取切片, 记录在另一个变量中。
>>> fizz = spam[1:5]
>>> fizz
'ello'
通过切片并将结果子字符串保存在另一个变量中, 就可以同时拥有完整的字符串和子字符串了, 便于快速访问。

5.字符串的in和not in 操作符

像列表一样, in和not in操作符也可以用于字符串, 用in 和 not in连接两个字符串得到的表达式, 将求值为布尔型。
>>> 'Hello' in 'Hello world'
True
>>> 'HELLO' in 'Hello world'
False
>>> 'cats' not in 'cats and dogs'
False
这些表达式测试一个字符串(精确匹配,区分大小写)是否在另一个字符串中。

6.有用的字符串方法

6.1字符串方法upper(), lower(), isupper()和islower()

  upper()和lower()字符串方法返回一个新的字符串, 其中原字符串的所有字符串的所有字母都将被相应的转换成大写或小写。字符串中非字母字符不变。
>>> spam = 'Hello world!2222'
>>> spam.upper()
'HELLO WORLD!2222'
>>> spam.lower()
'hello world!2222'
  请注意,这些方法并没有改变字符串本身, 而是返回一个新字符串, 如果你希望改变原来的字符串, 就可以在该字符串上调用upper()或lower(),
然后将这个新字符串赋给保存原来字符串的变量。这就是为什么必须使用spam = spam.upper(), 才能改变spam中的字符串, 
而不是仅仅使用spam.upper().
  如果要进行大小写无关的比较,upper()和lower()方法就很有用。
print('How are you?')
feeling = input()
if feeling.lower() == 'great':
    print('I feel great too')
else:
    print('I hope the rest of your day is good.')

========================= RESTART: D:\pywork\test.py =========================
How are you?
GReaT
I feel great too
>>>

如果字符串中至少有一个字母, 并且所有字母都是大写或者小写, isupper()和islower()方法就会相应的返回布尔值True.否则,返回False。
 >>> spam = 'Hello, world'
>>> spam.isupper()
False
>>> 'HELLO'.isupper()
True
>>> 'abc1224'.islower()
True
>>> '234'.islower()
False
>>> '123'.isupper()
False

6.2 isX字符串方法

除了isupper()和islower(), 还有几个字符串方法, 它们的名字以is开始,返回值为布尔型。下面是一些常用的isX犯法:
·isalpha()返回Ture, 如果字符串只包含字母, 并且非空
·isalnum()返回Ture, 如果字符串只包含字母和数字, 并且非空
·isdecimal()返回Ture, 如果字符串只包含数字,并且非空
·isspace()返回Ture, 如果字符串只包含空格, 制表符, 和换行,并且非空
·istitle()返回True, 如果字符串仅包含以大写字母开头, 后面都是小写字母的单词。
>>> 'hello '.isalpha()
False
>>> 'hello'.isalpha()
True
>>> 'hello123'.isalpha()
False
>>> 'hello123'.isalnum()
True
>>> 'hello'.isalnum()
True
>>> '123'.isdecimal()
True
>>> ' '.isspace()
True
>>> ' \t \n'.isspace()
True
>>> 'This Is Title Case'.istitle()
True
>>> 'This Is Title Case 1321'.istitle()
True
>>> 'This is Title case'.istitle()
False
>>> 'This Is Title CASE'.istitle()
False

6.3字符串方法startswith()和endswith()

startswith()和endswith()方法返回True(), 如果它们所调用的字符串以该方法传入的字符串开始或结束。否则返回False。
>>> 'Hello world!'.startswith('Hello')
True
>>> 'Hello world!'.endswith('world!')
True
>>> 'abc123'.startswith('abcdef')
False
>>> 'Hello world!'.startswith('Hello world!')
True
>>> 'Hello world!'.endswith('Hello world!')
True
如果只需要检查字符串的开始或结束部分是否等于另一个字符串, 而不是整个字符串, 这些方法就可以替代==。

6.4字符串方法join()和split()

如果有一个字符串你列表需要将它们连接起来, 成为一个单独的字符串, join()方法就很有用。 join()方法在一个字符串上调用,参数是一个字符串列表,
返回一个字符串。返回的字符串由传入的列表中每个字符串连接起来。
 >>> ','.join(['cat', 'dag', 'rat'])
'cat,dag,rat'
>>> ' '.join(['my', 'name', 'is', 'Alice'])
'my name is Alice'
>>> 'ABC'.join(['my', 'name', 'is', 'Alice'])
'myABCnameABCisABCAlice'
调动join()方法的字符串, 被插入到列表参数中的每一个字符串的中间。join()方法是针对一个字符串而调用的, 并且传入一个列表值。
split()方法刚好相反,它针对一个字符串调用, 返回一个字符串列表。
>>> 'my name is Leon'.split()
['my', 'name', 'is', 'Leon']
split()默认按照各种空白符分隔,诸如空格、制表符、换行符。也可以向split()方法传入一个分隔符,指定它按照不同的字符串分隔。
>>> 'myABCnameABCisABCAlice'.split('ABC')
['my', 'name', 'is', 'Alice']
>>> 'my name is Leon'.split('m')
['', 'y na', 'e is Leon']
一个常见的split()用法, 是按照换行符分隔多行字符串。
>>> spam = '''Dear Alice,
How have you been? I am fine.
There is a container in the fridge
that is labeled "Milk Experiment".

Please do not drink it.
Sincerely,
Bob'''
>>> spam.split('\n')
['Dear Alice,', 'How have you been? I am fine.', 'There is a container in the fridge', 'that is labeled 
"Milk Experiment".', '', 'Please do not drink it.', 'Sincerely,', 'Bob']
想split()方法传入参数‘\n’,我们按照换行符分割变量中存储的多行字符串, 返回列表中的每个表项, 对应于字符串中的一行。

6.5用rjust(), ljust()和center()方法对齐文本

rjust()和ljust()字符串方法返回调用它们的字符串的填充版本, 通过插入空格来对齐文本。 这两个方法第一个参数是一个整数长度, 用于对齐字符串。
>>> 'Hello'.rjust(10)
'     Hello'
>>> 'Hello'.rjust(20)
'               Hello'
>>> 'Hello world'.rjust(20)
'         Hello world'
>>> 'Hello'.ljust(10)
'Hello     '
‘Hello’.rjust(10)是说我们希望右对齐, 将‘Hello’放在一个长度为10的字符串中, ‘Hello’有5个字符, 所以左边会加上五个空格, 
得到一个10个字符的字符串, 实现了‘Hello’的右对齐。
rjust()和ljust()的第二个可选参数是将指定一个填充字符取代空格字符。
>>> 'Hello'.ljust(10, '*')
'Hello*****'
>>> 'Hello'.rjust(20, '&')
'&&&&&&&&&&&&&&&Hello'
center()方法与rjust()和ljust()类似,但它让文本居中,而不是左对齐或者右对齐。
>>> 'Hello'.center(10)
'  Hello   '
>>> 'Hello'.center(20)
'       Hello        ' 
>>> 'Hello'.center(20, '-')
'-------Hello--------'

6.6用strip(),rstrip()和lstrip()删除空白字符

有时你希望删除字符串左边、右边或两边的空白字符(空格、制表符、换行符)。strip()字符串方法将返回一个新的字符串,
它的开头或末尾都没有空白字符。lstrip()和rstrip()方法将相应删除左边或者右边的空白字符。
>>> spam = '  Hello World  '
>>> spam.strip()
'Hello World'
>>> spam.lstrip()
'Hello World  '
>>> spam.rstrip()
'  Hello World'
有一个可选的字符串参数, 指定两边的那些字符应该删除。
>>> spam = 'SpamSpamBaconSpamEggsSpamSpam'
>>> spam.strip('ampS')
'BaconSpamEggs'
想strip()方法传入参数‘ampS’,告诉它在变量中存储的字符串两端删除出现的a,m,p,S。传入strip()方法的字符串中,
字符的顺序并不重要:strip('ampS')做的事和strip('mapS')和strip('Spam')一样.

6.7用pyperclip模块拷贝粘贴字符串

pyperclip模块有copy()和paste()函数, 可以向计算机的剪贴板发送文本, 或从它接收文本。 将程序的输出发送到剪贴板, 
使它容易粘贴到邮件、 文字处理程序或其他软件中。pyperclip模块不是python自带的,要安装该模块。
安装:pip install pyperclip
>>> import pyperclip
>>> pyperclip.copy('Hello World!')
>>> pyperclip.paste()
'Hello World!'
当然, 如果你的程序之外的某个程序改变了剪贴板的内容,paste()函数就会返回它。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355