Python编程快速上手 9.0分
读书笔记 7
_

第7章 正则表达式

1. 正则表达式,简称为regex,是文本模式的描述方法。例如,\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字。在一个模式后加上{3},就是说“匹配这个模式3次”。所以较短的正则表达式\d{3}-\d{3}-\d{4},也匹配111-111-1111这种电话号码格式。

2. 所有正则表达式的函数都在re模块中,向re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象。

3. Search()方法查找传入的字符串,寻找该正则表达式的所有匹配,search方法返回一个match对象,match对象有一个group()方法,返回被查找字符串中实际匹配的文本。变量名mo是一个通用的名称,用于match对象。

例:phone_number = re.compile(r’\d\d\d-\d\d\d-\d\d\d\d’)

Mo = phone_number.search(‘My number is 444-444-4444.’)

Print(‘Phone number found: ‘+ mo.group())

4. 添加括号在正则表达式中创建“分组”:(\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用group()匹配对象方法,从一个分组中获取匹配的文本。正则表达式字符串中的第一对括号是第1组。第二对括号是第2组。向group传入整数1或2,就可以取得匹配文本的不同部分,传入0或不传入参数就返回整个匹配的文本。 如果想要一次就获取所有的分组,请使用groups()方法。如果需要在文本中匹配括号,就用转义符号如\(。

5. 用管道|匹配多个分组:希望匹配许多表达式中的一个就使用它,如r’Batman|Tina Fey’匹配’Batman’& ‘Tina Fey’,如果两个都出现在字符串中,第一次出现的匹配文字将作为match对象返回。例:希望匹配Batman, Batmobile, Batcopter, Batbat中任意一个,如果能够只指定一次前缀,就很方便。可以 r’Bat(man|mobile|copter|bat)’这里用mo.group()会返回整个如Batmobile,但用mo.group(1)只返回第一个括号里匹配的文本mobile。

6. 问号?实现可选匹配:表明它前面的分组在这个模式中是可选的。如r’Bat(wo)?man’这里wo就是可选的分组。即batman,batwoman都行。

7. 星号*是匹配零次或多次:即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复。如r’Bat(wo)*man’ 则batman,batwoman,batwowowoman都行。

8. 加号+匹配一次或多次:同上 r’Bat(wo)+man’则必须出现一次wo,batwoman,batwowoman

9. 花括号{}匹配特定次数:除了数字还可以指定一个范围,如r’(HA){3}’匹配3次HA,r’(HA){,5}’匹配0次到5次HA

10. 贪心和非贪心匹配:正则表达式是默认贪心的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。非贪心版本则尽可能匹配最短的字符串,即在结束的花括号后跟着一个问号。r’(HA){3,5}?’,不加?匹配5词,加了匹配3次即止。

11. Findall()方法,search()将返回一个对象,包含被查找字符串中的“第一次”匹配的文本,而findall()方法将返回一组字符串,包含被查找字符串中的所有匹配。另一方面,findall不是返回一个match对象,而是返回一个字符串列表,列表中的每个字符串都是一段被查找的文本,如果在正则表达式中有分组,那么findall将返回元组的列表。

12. 字符分类:\d表示0-9的任何数字,\D表示除0到9的数字以外的任何字符,\w表示任何字母、数字或下划线字符(可以认为是匹配“单词”字符),\W表示除字母、数字和下划线以外的任何字符,\s表示空格、制表符或换行符(可以认为是匹配空白字符),\S表示除空格、制表符和换行符以外的任何字符,字符分类[0-5]只匹配数字0到5,如r’\d+\s\w+’匹配一个或多个数字接下来一个空白字符接下来是一个或多个字母&数字&下划线字符。例如,字符分类[aeiouAEIOU]匹配所有援引字符,也可以使用段横杠表示字母或数字范围,如[a-zA-Z0-9]匹配所有大小写字母和数字。注意这里是方括号。在方括号里开头加上一个插入字符^,就可以得到“非字符类”,将匹配不在这个字符类中的所有字符,如[^aeiouAEIOU]匹配所有不是元音字母的字符。

13. 在正则表达式开头插入^符号,表示匹配必须发生在文本开始出,$表示必须在文本结束处,可同时使用。如r’^\d+$’匹配从开始到结束都是数字的字符串。

14. 通配符.匹配除了换行之外的所有字符。如r’.at’匹配cat,hat,sat,句点字符只匹配一个字符。

15. 用.-*匹配所有字符,如r’FN: (.*) LN:(.*)’。默认贪心,非贪心要用.*?

16. 通过传入re.DOTALL作为re.compile()的第二个参数,可以让句点字符匹配所有的字符,包括换行字符。如re.compile(‘.*’, re.DOTALL);不区分大小写的匹配则传入re.IGNORECASE或re.I,作为第二个参数;用re.VERBOSE可以将正则表达式放在多行中,并加上注释。组合使用以上多个第二参数可以使用管道|。

17. Sub()方法替换字符串,传入两个参数,第一个参数是一个字符串,用于取代发现的匹配。第二参数是一个字符串,是用正则表达式匹配的内容。Sub()方法返回替换完成后的字符串。如果需要使用匹配的文本本身,作为替换的一部分。在sub()的第一个参数中,可以输入\1,\2,\3...表示“在替换中输入分组1,2,3..的文本”。

如 anget_name = re.compile(r’Agent (\w)\w* ’)

Anget_name.sub(r’\1****’, ‘Agent Alice’) #这里的1就是第一个分组里得到的名字首字母。

>>> A****

18. 当你开始接手一个新项目时,很容易想要直接开始写代码。但更多的时候,最好是后退一步,考虑更大的图景。我建议先草拟高层次的计划,弄清楚程序需要什么。暂时不要思考真正的代码,稍后再来考虑,现在,先关注大框架。

0
《Python编程快速上手》的全部笔记 9篇
豆瓣
免费下载 iOS / Android 版客户端