Python基础 第七章
7.1 基础概念
使用正则表达式查找文本: 正则表达式简称regex,\d是一个正则表达式,表示一位数字字符。
\d\d\d-\d\d\d-\d\d\d\d 表示三个数字,一个短横线,三个数字,一个短横线,四个数字的匹配对象,所有其他字符串都不能匹配以上的对象。
形如 \d{3}-\d{3}-\d{4}的格式,和以上格式表示查找同一对象。
创建正则表达式对象: 所有正则表达式对象都保存在re模块中,因此首先要载入对象 import re。
匹配regex对象: Regex使用search()方法查找传入的字符串,寻找该正则表达式的所有匹配。若未能查找到,则返回None。若找到了该对象,则返回一个Match对象。
案例:
>>>number = re.compile(r'\d\d\d=\d\d\d-\d\d\d')
>>>mo = number.search('my number is 415-123-323')
>>>print('number is :' + mo.group())
number is : 415-123-323
正则表达式匹配规则:
- 用import re 导入模块
- 用re.compile 创建一个Regex对象。
- 向Regex对象的search()方法传入想查找的字符串,返回一个match对象。
- 调用match对象的group()方法,返回实际匹配文本的字符串。
利用括号分组: 正则表达式中第一个括号内是第一组,第二个括号内是第二组。可向group函数传入不同的数字,可以取得匹配文本的不同部分。向group()传入0或不传入,则会获得整个匹配的文本。
也可以使用多重赋值,此时需要调用groups()
>>>a.groups()
('123','456')
>>>diyizu,dierzu = a.groups()
>>>print(diyizu)
123
使用管道分配多个分组: 字符|称为管道,希望匹配许多表达式中的一个时,即可以使用它。
例如,r ‘123|456’ 就将匹配 ‘123’ 或 ‘456’ 。
若两个对象都出现在被查找的字符串中,那么第一次出现的匹配文本,将作为match对象返回。
星号实现匹配0或多次: *意味着匹配0次或多次,即 * 以前的内容可以出现也可以不出现。
用+匹配一次或多次: *意味着匹配0次或多次,而+意味匹配1次或多次。*不要求出现在匹配的字符串中,而+意味至少出现一次。
贪心和非贪心匹配: Python默认的匹配原则是“贪心”的,表示在有二义的情况下,会尽量匹配最长的字符串。花括号的“非贪心”表示匹配尽可能短的字符串。
findall()方法: findall()将返回一组字符串,包含被查找字符串的所有匹配。
另外,findall()不是返回一个match对象,而是返回一个字符串列表。只要在正则表达式中没有分组,每个字符串都是一段被查找的文本。
插入字符和美元字符: 可以在正则表达式的开始处使用 ^ 表示匹配必须发生在被查找文本开始处,同样也可以在末尾加上$符号,表明字符串必须以这个正则表达式的模式结束。可以同时使用 ^ 和 $ ,表明整个字符串必须匹配整个模式。
通配字符: 在正则表达式中,“.”称为“通配符”,匹配除了换行符之外的所有字符。
语法汇总:
?匹配0次或1次
*匹配0次或多次
+匹配1次或多次
{n}匹配n次前面的分组
{n,}匹配n次或更多前面的分组
{,m}匹配0到m次前面的分组
{n,m}匹配至少n次,至多m次前面的分组
{n,m}?表示非贪心匹配
^spam表示必须以spam开始
spam$表示必须以spam结束
7.2 习题
1、向 re.compile() 传入一个字符串值,表示正则表达式,它将返回一个Regex 模式对象(或者就简称为 Regex 对象)。
2、因为正则表达式常常使用倒斜杠,向 re.compile() 函数传入原始字符串更为方便,而不是输入额外的倒斜杠。 。
3、search() 方法查找传入的字符串,寻找该正则表达式的所有匹配。
如果字符串中含有该模式,search() 方法将返回一个 Match 对象。
如果字符串中没有找到该正则表达式模式,search() 方法将返回 None。
4、Match 对象有一个 group() 方法,它返回被查找字符串中实际匹配的文本。
5、如果向 group() 方法传入 0 或者不传入参数,即 group(0) 或 group(),将返回整个匹配的文本。因此,分组 0
表示(\d\d\d)-(\d\d\d-\d\d\d\d)。分组 1 表示第一个括号中包含的内容,即(\d\d\d)。分组 2
表示第二个括号中包含的内容,即(\d\d\d-\d\d\d\d)。
6、需要在括号和句点前,加上倒斜杠(也就是\)进行转义。
7、如果正则表达式没有分组,如\d\d\d-\d\d\d\d-\d\d\d\d,findall()将返回一个匹配字符串的列表。
8、|字符叫做“管道”。如果希望匹配许多表达式中的一个时,可以使用它,如:r’beijing|shanghai|gaungzhou’。
9、? 字符可以表示“匹配前面分组0 次或1 次”,或用于表示贪心配。
10、+匹配1 次或多次。匹配0 次或多次。
11、{3}匹配前面分组的精确3 次实例。{3, 5} 匹配3 至5 次实例。
12、缩写字符分类\d、\w 和\s 分别匹配一个数字、单词或空白字符。
13、缩写字符分类\D、\W 和\S 分别匹配一个字符,它不是数字、单词或空白字符。
14、将re.I 或re.IGNORECASE 作为第二个参数传入re.compile(),让匹配不区分大小写。
15、字符.通常匹配任何字符,换行符除外。如果将re.DOTALL 作为第二个参数传入re.compile(),那么点也会匹配换行符。
16、执行贪心匹配,.?执行非贪心匹配。
17、[a-z0-9]或[0-9a-z]
18、‘X drummers, X pipers, five rings, X hens’
19、re.VERBOSE 参数忽略正则表达式字符串中的空白符和注释
20、re.compile(r’^\d{1,3}(,{3})$’)
21、re.compile(r’[A-Z][a-z]*\sNakamoto’)
22、re.compile(r’([^Alice|Bob|Carol])\s([eat|pets|throws])\s[apples|cats|baseballs].’,re.IGNORECASE)