- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
6.2 有用的字符串方法
一些字符串方法会分析字符串,或生成转变过的字符串。本节介绍了这些方法,你会经常使用它们。
6.2.1 字符串方法upper()、lower()、isupper()和islower()
upper()和lower()字符串方法返回一个新字符串,其中原字符串的所有字母都被相应地转换为大写或小写。字符串中非字母字符保持不变。
在交互式环境中输入以下代码:
>>> spam = 'Hello world!' >>> spam = spam.upper() >>> spam 'HELLO WORLD!' >>> spam = spam.lower() >>> spam 'hello world!'
请注意,这些方法没有改变字符串本身,而是返回一个新字符串。如果你希望改变原来的字符串,就必须在该字符串上调用upper()或lower(),然后将这个新字符串赋给保存原来字符串的变量。这就是为什么必须使用 spam = spam.upper(),才能改变spam中的字符串,而不是仅仅使用spam.upper()(这就好比,如果变量eggs中包含值10,写下eggs + 3并不会改变eggs的值,但是eggs = eggs + 3会改变eggs的值)。
如果需要进行大小写无关的比较,upper()和lower()方法就很有用。字符串'great'和'GREat'彼此不相等。但在下面的小程序中,用户输入Great、GREAT或grEAT都没关系,因为字符串首先被转换成小写。
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.')
在运行该程序时,先显示问题,然后输入变形的great,如GREat,程序将给出输出I feel great too。在程序中加入代码,处理多种用户输入情况或输入错误,诸如大小写不一致,这会让程序更容易使用,且更不容易失效。
How are you? GREat I feel great too.
如果字符串至少有一个字母,并且所有字母都是大写或小写,isupper()和islower()方法就会相应地返回布尔值True。否则,该方法返回False。在交互式环境中输入以下代码,并注意每个方法调用的返回值:
>>> spam = 'Hello world!' >>> spam.islower() False >>> spam.isupper() False >>> 'HELLO'.isupper() True >>> 'abc12345'.islower() True >>> '12345'.islower() False >>> '12345'.isupper() False
因为upper()和lower()字符串方法本身返回字符串,所以也可以在“那些”返回的字符串上继续调用字符串方法。这样做的表达式看起来就像方法调用链。在交互式环境中输入以下代码:
>>> 'Hello'.upper() 'HELLO' >>> 'Hello'.upper().lower() 'hello' >>> 'Hello'.upper().lower().upper() 'HELLO' >>> 'HELLO'.lower() 'hello' >>> 'HELLO'.lower().islower() True
6.2.2 isX字符串方法
除了islower()和isupper(),还有几个字符串方法,它们的名字以is开始。这些方法返回一个布尔值,描述了字符串的特点。下面是一些常用的isX字符串方法:
· isalpha()返回True,如果字符串只包含字母,并且非空;
· isalnum()返回True,如果字符串只包含字母和数字,并且非空;
· isdecimal()返回True,如果字符串只包含数字字符,并且非空;
· isspace()返回True,如果字符串只包含空格、制表符和换行,并且非空;
· .istitle()返回True,如果字符串仅包含以大写字母开头、后面都是小写字母的单词。
在交互式环境中输入以下代码:
>>> 'hello'.isalpha() True >>> 'hello123'.isalpha() False >>> 'hello123'.isalnum() True >>> 'hello'.isalnum() True >>> '123'.isdecimal() True >>> ' '.isspace() True >>> 'This Is Title Case'.istitle() True >>> 'This Is Title Case 123'.istitle() True >>> 'This Is not Title Case'.istitle() False >>> 'This Is NOT Title Case Either'.istitle() False
如果需要验证用户输入,isX字符串方法是有用的。例如,下面的程序反复询问用户年龄和口令,直到他们提供有效的输入。打开一个新的文件编辑器窗口,输入以下程序,保存为validateInput.py:
while True: print('Enter your age:') age = input() if age.isdecimal(): break print('Please enter a number for your age.') while True: print('Select a new password (letters and numbers only):') password = input() if password.isalnum(): break print('Passwords can only have letters and numbers.')
在第一个while循环中,我们要求用户输入年龄,并将输入保存在age中。如果age是有效的值(数字),我们就跳出第一个while循环,转向第二个循环,询问口令。否则,我们告诉用户需要输入数字,并再次要求他们输入年龄。在第二个while循环中,我们要求输入口令,客户的输入保存在password中。如果输入是字母或数字,就跳出循环。如果不是,我们并不满意,于是告诉用户口令必须是字母或数字,并再次要求他们输入口令。
如果运行,该程序的输出看起来如下:
Enter your age: forty two Please enter a number for your age. Enter your age: 42 Select a new password (letters and numbers only): secr3t! Passwords can only have letters and numbers. Select a new password (letters and numbers only): secr3t
在变量上调用isdecimal()和isalnum(),我们就能够测试保存在这些变量中的值是否为数字,是否为字母或数字。这里,这些测试帮助我们拒绝输入forty two,接受42,拒绝secr3t!,接受secr3t。
6.2.3 字符串方法startswith()和endswith()
startswith()和endswith()方法返回True,如果它们所调用的字符串以该方法传入的字符串开始或结束。否则,方法返回False。在交互式环境中输入以下代码:
>>> 'Hello world!'.startswith('Hello') True >>> 'Hello world!'.endswith('world!') True >>> 'abc123'.startswith('abcdef') False >>> 'abc123'.endswith('12') False >>> 'Hello world!'.startswith('Hello world!') True >>> 'Hello world!'.endswith('Hello world!') True
如果只需要检查字符串的开始或结束部分是否等于另一个字符串,而不是整个字符串,这些方法就可以替代等于操作符==,这很有用。
6.2.4 字符串方法join()和split()
如果有一个字符串列表,需要将它们连接起来,成为一个单独的字符串,join()方法就很有用。join()方法在一个字符串上调用,参数是一个字符串列表,返回一个字符串。返回的字符串由传入的列表中每个字符串连接而成。例如,在交互式环境中输入以下代码:
>>> ', '.join(['cats', 'rats', 'bats']) 'cats, rats, bats' >>> ' '.join(['My', 'name', 'is', 'Simon']) 'My name is Simon' >>> 'ABC'.join(['My', 'name', 'is', 'Simon']) 'MyABCnameABCisABCSimon'
请注意,调用join()方法的字符串,被插入到列表参数中每个字符串的中间。例如,如果在', '字符串上调用join(['cats', 'rats', 'bats']),返回的字符串就是'cats, rats, bats'。
要记住,join()方法是针对一个字符串而调用的,并且传入一个列表值(很容易不小心用其他的方式调用它)。split()方法做的事情正好相反:它针对一个字符串调用,返回一个字符串列表。在交互式环境中输入以下代码:
>>> 'My name is Simon'.split() ['My', 'name', 'is', 'Simon']
默认情况下,字符串'My name is Simon'按照各种空白字符分割,诸如空格、制表符或换行符。这些空白字符不包含在返回列表的字符串中。也可以向split()方法传入一个分割字符串,指定它按照不同的字符串分割。例如,在交互式环境中输入以下代码:
>>> 'MyABCnameABCisABCSimon'.split('ABC') ['My', 'name', 'is', 'Simon'] >>> 'My name is Simon'.split('m') ['My na', 'e is Si', 'on']
一个常见的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.2.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个字符,所以左边会加上5个空格,得到一个10个字符的字符串,实现'Hello'右对齐。
rjust()和ljust()方法的第二个可选参数将指定一个填充字符,取代空格字符。在交互式环境中输入以下代码:
>>> 'Hello'.rjust(20, '*') '***************Hello' >>> 'Hello'.ljust(20, '-') 'Hello---------------'
center()字符串方法与ljust()与rjust()类似,但它让文本居中,而不是左对齐或右对齐。在交互式环境中输入以下代码:
>>> 'Hello'.center(20) ' Hello ' >>> 'Hello'.center(20, '=') '=======Hello========'
如果需要打印表格式数据,留出正确的空格,这些方法就特别有用。打开一个新的文件编辑器窗口,输入以下代码,并保存为picnicTable.py:
def printPicnic(itemsDict, leftWidth, rightWidth): print('PICNIC ITEMS'.center(leftWidth + rightWidth, '-')) for k, v in itemsDict.items(): print(k.ljust(leftWidth, '.') + str(v).rjust(rightWidth)) picnicItems = {'sandwiches': 4, 'apples': 12, 'cups': 4, 'cookies': 8000} printPicnic(picnicItems, 12, 5) printPicnic(picnicItems, 20, 6)
在这个程序中,我们定义了printPicnic()方法,它接受一个信息的字典,并利用center()、ljust()和rjust(),以一种干净对齐的表格形式显示这些信息。
我们传递给printPicnic()的字典是picnicItems。在picnicItems中,我们有4个三明治、12个苹果、4个杯子和8000块饼干。我们希望将这些信息组织成两行,表项的名字在左边,数量在右边。
要做到这一点,就需要决定左列和右列的宽度。与字典一起,我们将这些值传递给printPicnic()。
printPicnic()接受一个字典,一个leftWidth表示表的左列宽度,一个rightWidth表示表的右列宽度。它打印出标题PICNIC ITEMS,在表上方居中。然后它遍历字典,每行打印一个键-值对。键左对齐,填充句号。值右对齐,填充空格。
在定义printPicnic()后,我们定义了字典picnicItems,并调用printPicnic()两次,传入不同的表左右列宽度。
运行该程序,野餐用品就会显示两次。第一次左列宽度是12个字符,右列宽度是5个字符。第二次它们分别是20个和6个字符。
---PICNIC ITEMS-- sandwiches.. 4 apples...... 12 cups........ 4 cookies..... 8000 -------PICNIC ITEMS------- sandwiches.......... 4 apples.............. 12 cups................ 4 cookies............. 8000
利用rjust()、ljust()和center()让你确保字符串整齐对齐,即使你不清楚字符串有多少字符。
6.2.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.2.7 用pyperclip模块拷贝粘贴字符串
pyperclip模块有copy()和paste()函数,可以向计算机的剪贴板发送文本,或从它接收文本。将程序的输出发送到剪贴板,使它很容易粘贴到邮件、文字处理程序或其他软件中。pyperclip模块不是Python自带的。要安装它,请遵从附录A中安装第三方模块的指南。安装pyperclip模块后,在交互式环境中输入以下代码:
>>> import pyperclip >>> pyperclip.copy('Hello world!') >>> pyperclip.paste() 'Hello world!'
当然,如果你的程序之外的某个程序改变了剪贴板的内容,paste()函数就会返回它。例如,如果我将这句话复制到剪贴板,然后调用paste(),看起来就会像这样:
>>> pyperclip.paste() 'For example, if I copied this sentence to the clipboard and then called paste(), it would look like this:'
在IDLE之外运行Python脚本
到目前为止,你一直在使用IDLE中的交互式环境和文件编辑器来运行Python脚本。但是,你不想每次运行一个脚本时,都打开IDLE和Python脚本,这样不方便。好在,有一些快捷方式,让你更容易地建立和运行Python脚本。这些步骤在Windows、OS X和Linux上稍有不同,但每一种都在附录B中描述。请翻到附录B,学习如何方便地运行Python脚本,并能够向它们传递命令行参数。(使用IDLE时,不能向程序传递命令行参数。)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论