1.import re :导入正则表达式模块
2.>re.compile() :传入一个字符串值(正则表达式),返回一个Regex对象.
3.Regex.search() :查找传入的字符串,寻找该正则表达式的所有匹配。没有找到该正则表达式模式,返回None;找到,返回一个Match对象。
4.Match.group():返回实际匹配到的文本
re.compile(r'\d{3}-\d{3}-\d{4}'):在字符串的第一个引号之前加上r,可以将该字符串标记为原始字符串,它不包括转义字符。
7.3 用正则表达式匹配更多模式
- 括号分组
- phoneNumRegex = re.compile(r'(\d{3})-(\d{3}-\d{4})')
第一对括号是第一组,第二对括号是第二组
- match.group(1): 向group()匹配对象方法传入1或2,就可以获得匹配文本的不同部分。传入0或不传入参数,将返回整个匹配文本。
- Match.groups(),一次获取所有的分组-
areaCode,mainNumber = match.groups()
- 如果文本中有() ,需要用\(\) 进行转译
7.3.2 管道匹配多个分组
| :管道 ;
- 作用: 希望匹配许多表达式中一个。
heroRegex = re.compile(r'Batman|Tina Fey')
》第一次出现的匹配文本,将作为match对象返回。
》要返回全部的匹配文本,使用findall() 方法取代search()方法》
》若正则表达式没有分组,findall()返回字符串列表
》若正则表达式有分组,findall()返回元组列表
7.3.3 用?实现可选匹配
可选匹配:可以匹配或不用匹配
? 符号实现该功能
>eg:
phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d')
phoneRegex_m1 = phoneRegex.search('My phone number s 413-222-2332')
print(phoneRegex_m1.group())
phoneRegex_m2 = phoneRegex.search('My phone number is 555-2123')
print(phoneRegex_m2.group())
7.3.4 用*符号匹配0次或多次
即;*符号之前的分组,可以在文本中出现任意次。他可以完全不存在,或一次又一次地重复
br = re.compile(r'Bat(wo)*man')
m1 = br.search('The Adventures of Batman.')
print(m1.group())
m2 = br.search('The Adventures of Batwoman.')
print(m2.group())
m3 = br.search('The Adventures of Batwowowowoman.')
print(m3.group())
7.3.5 用+ 符号 匹配一次或多次
+与*不同的是,+符号前面的分组必须“至少出现一次”。
Eg:
br = re.compile(r'Bat(wo)+man')
m1 = br.search('The Adventures of Batman.')
if m1:
print(m1.group())
m2 = br.search('The Adventures of Batwoman.')
if m2:
print(m2.group())
m3 = br.search('The Adventures of Batwowowowoman.')
if m3:
print(m3.group())
7.3.6 用或括号匹配特定次数
1. 在正则表达式中该分组的后面,跟上花括号包围的数字。
(ha){3} :将匹配字符串‘HaHaHa’,但是不会匹配‘HaHa’.
- 还可以指定一个范围:即在花括号中写下一个最小值,一个逗号,和一个最大值。(Ha){3,5} 即匹配‘HaHaHa,HaHaHaHa,HaHaHaHaHa’
3.(Ha){3,} 将匹配3次或更多次的实例
(Ha){,5}将匹配0到5次实例
7.4 贪心和非贪心匹配
Eg:’HaHaHaHaHaHa’,(Ha){3,5}可以匹配3,4,个。而match对象的group()方法会返回HaHaHaHaHa,而不是更短的可能结果。
》Python的正则表达式默认是贪心的,表示在有二义的情况下,他们可能会匹配最长的字符串。
非贪心版本: 在结束的花括号后跟着一个?
(Ha){3,5}?
>eg:
greedy = re.compile(r'(Ha|ha){3,5}')
m = greedy.search('HahahaHaha')
print(m.group())
nongreedy = re.compile(r'(Ha|ha){3,5}?')
m2 = nongreedy.search('HahahaHaha')
print(m2.group())
7.6 字符分类
\d 表示 0-9的任何数字 即(0|1|2|3|4|5|6|7|8|9)
\D 除0到9的数字以外的任何字符
\w 任何字母,数字或下划线字符(可以认为是匹配“单词”字符)
\W 除字母,数字和下划线以外的任何字符
\s 空格,制表符或换行符(可以认为是匹配“空白”字符)
\S 除空格,制表符,和换行符以外的任何字符
Eg:
rg = re.compile(r'\d+\s\w+')
m = rg.findall('12 drummers, 11 pipers 10 lords,9 ladies')
print(m)
7.7 建立自己的字符分类
Syntax : [] 定义自己的字符分类
Eg:>[aeiouAEIOU]将匹配所有元音字符,不论大小写
- 通过在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”。
》非字符类将匹配不在这个字符类中的所有字符。
7.8 插入字符和美元字符
插入符号 ^ :在正则表达式的开始处使用插入符号 ^, 表明匹配必须发生在被查找文本的开始处。
如
美元符号:$:表明该字符串必须以这个正则表达式的模式结束。
若同时使用^,$,表明整个字符串必须匹配该模式。
Eg:
beginWithHello = re.compile(r'^Hello')
m1 = beginWithHello.search('oh my god Hello World.')
m2 = beginWithHello.search('Hello, world.')
if m1:
print('m1 :'+ m1.group())
if m2:
print('m2 :' + m2.group())
只运行 m2: hello.
>r’^\d+$’:匹配以数字0到9结束的字符串
7.9 通配字符
. (句点) :匹配除了换行之外的所有字符。
》句点字符只匹配一个字符。
7.9.1 点-星匹配所有字符
(.*) 表示任意文本-包括括号
.* 使用贪心模式;.*? 非贪心模式
1》 re.compile(‘.*’,re.DOTALL) 通过给re.compile()传入第二个参数re.DOTALL,可以将.*字符匹配所有字符。
7.10 正则表达式符号复习
》? 匹配0次或一次前面的分组
》*匹配0次或多次前面的分组
》+匹配一次或多次前面的分组
》{n}匹配n次前面的分组
》{n,}匹配n次或更多前面的分组
》{,m}屁屁0次到m次前面的分组
》{n,m}匹配至少n次,至多m次前面的分组
》{n,m}?进行非贪心匹配,匹配n次
》^spam :意味着 字符串必须以spam开始
》spam$ 意味着字符串必须以spam结束
》\d, \w,\s 分别匹配数字,单词,空格
》\D,\W,\S 分别匹配除数字,单词,空格以外 的所有字符
》[a,b,c]匹配方括号内的任意字符
》[^abc]:匹配不在方括号内的任意字符
7.11 不区分大小写的匹配
向re.compile()传入re.IGNORECASE 或re.I作为第二个参数,让正则表达式不区分大小写。
7.12 用sub()方法替换字符串
>sub()返回替换完成后的字符串
7.13 管理复杂的正则表达式
忽略正则表达式字符串中的空白符和注释,向re.compile()传入变量re.VERBOSE,作为第二个参数。
》re.compile(’’’ ’’’)三重引号,创建一个多行字符串。
可以将正则表达式定义放在多行中,让它可以读。
phoneRegex = re.compile(r'''
(\d{3}|\(\d{3}\))? #Area code
(\s|-|.)? #separator
(\d{3}) #3 digits
(\s|-|.) #separator
(\d{4}) #last 4 digits
((\s*|ext|x|ext\.|)\s*(\d{2,5}))? #extension
''',re.VERBOSE)
通过使用re.VERBOSE参数,黄色区域,红色字 被忽略