1.1 不用正则表达式来匹配文本
假设我希望在一个字符串中找到电话号码,电话号码的格式为三个数字,一个短横线,四个数字,一个短横线,四个数字 比如:131-3310-5293和132-2670-9864
def IsTruePhoneNumber(content):
if(len(content))!=13: #首先判断号码长度是否超过13,算上短横线长度
return False
for i in range(0,3): #判断前三位字符是否为数字
if not content[i].isdecimal():
return False
if content[3]!='-': #判断第四位字符是否为短横线,不是则返回错误
return False
for i in range(4,8):
if not content[i].isdecimal():
return False
if content[8]!='-':
return False
for i in range(9,13):
if not content[i].isdecimal():
return False #python里面严格区分False和True的首字母大写
return True
account='Please call me at 131-3310-5293 and my another telephone number is 132-2670-9864'
for i in range(len(account)):
number=account[i:i+13]
if IsTruePhoneNumber(number):
print('Phone Number is '+number)
print('It is accomplished')
#print('There will be a piece of phonenumber:')
#print(IsTruePhoneNumber(content))
结果如图:
1.2 用正则表达式查找文本模式
正则表达式,简称为regex
,是文本模式的描述方法。例如,\d 是一个正则表达式,表示一位数字字符,即表示任何一位 0 到 9 的数字。Python 使用正则表达式 \d\d\d-\d\d\d-\d\d\d\d,来匹配前面的函数IsTruePhoneNumber()与之相对应的同样文本:3 个数字、 一个短横线、4个数字、1个短横线、4 个数字。所有其它字符串都不能匹配 \d\d\d-\d\d\d\d-\d\d\d\d 正则表达式。
正则表达式可以更加复杂
,添加一个用得着的功能,比如在一个模式后面添加花括号\d{3},意思为匹配这个模式三次,可以应用在配对密码方面
1.2.1创建正则表达式对象
Python中所有的正则表达式都在re模块中,所以必须先通过import来引入re模块
向re模块中的re.compile()中创建一个字符串作为参数来表示正则表达式,此时将返回一个regex对象,比如,创建一个regex对象来匹配上一个IsPhoneTRUENumber()函数
1.2.2 匹配Regex对象
Regex的research()方法用来寻找与正则表达式匹配的所有对象,如果没有找到,research()方法将返回None,显示错误。如果找到,search()方法将返回一个Match对象。Match对象有一个group()方法用来返回寻找到的已匹配的文本
1.3 用正则表达式匹配更多模式
1.3.1 利用括号分组
假如分离电话号码中的运营商号段,前三位可以区别是哪个运营商,电信,联通或者移动,可以将号码分为两段。正则表达式作为参数的字符串中的第一对括号是第 1 组,第二对括号是第 2 组。通过 group() 方法匹配对象传入整数1或2,就可以取得匹配文本的不同部分。向 group()方法传入0或不传入参数,将返回整个匹配的文本。
如果想要一次性得到分离的两段字符串,就可以利用groups()方法,也可以采用两个变量来利用groups()方法分别赋值第一段和第二段
如果
需要在正则表达式中添加括号,则可以用转义字符\
1.3.2 利用管道匹配多个分组
字符
|
称为管道,用来匹配多个分组中的一个时,类似于C语言中的或,就可以使用它来进行此项操作,但是返回的是第一个匹配到的对象
也可以用来匹配多个模式中的一个,作为正则表达式的一部分,比如:everywhere,everyone,everytime,everyday。提取它们共同的前缀 every(如果需要匹配换到字符,则添加倒斜杠 |)
1.3.3 利用问号实现选择匹配
(字符串)?字符串
为选择模式,即添加?前面的或者不添加问号前面的。?即匹配这个?前的分组零次或一次。比如:
还可以进行多模式匹配
1.3.4 利用星号实现匹配
利用
*
实现匹配*前面的分组零次或多次
1.3.5 利用加号实现匹配
利用+实现分组匹配,即+前的分组出现一次或多次,至少出现一次,如果未出现,则返回None
1.3.6 用花括号实现匹配
花括号可以规定分组的匹配次数,不符合要求则返回空或者规定的最大模式匹配次数的模式,分组中只能包含要求匹配的模式,否则返回空
格式为(模式){匹配次数} 比如(模式){3,5}则表示模式匹配次数从3到5 (){,5}则表示模式匹配次数从0到5 (){3,}则表示模式匹配次数为从3到更多次数
1.4 贪心匹配和非贪心匹配
贪心匹配尽可能匹配最多的实例,非贪心匹配尽可能匹配最少的实例
非贪心匹配在花括号后加?(问号)在正则表达式末尾加,或者是你想选择的模式后加
1.5 findall()方法
Regex对象除了有search()方法,还有findall()方法,search()方法返回的是第一次匹配正则表达式的模式,findall()方法返回的是正则表达式匹配到的所有模式。
(1)如果正则表达式中没有分组,则返回的为包含字符串的列表
(2)如果正则表达式中有分组,则返回的是包含元组的列表
(1)
(2)
1.6 字符分类
\d 0-9内的任意数字
\D 除0-9内的任意数字
\w 任何字母、数字或下划线字符
\W 除字母、数字或下划线以外的任何字符
\s 空格、制表符或换行符
\S 除空格、制表符或换行符以外的任何字符
–
–
正则表达式\d+\s\w+匹配的文本有一个或多个数字(\d+),不加加号默认为匹配一个,接下来是一个空白字 符(\s),接下来是一个或多个字母/数字/下划线字符(\w+)。findall()方法将返回所有匹 配该正则表达式的字符串,放在一个列表中。
1.7 建立自己的字符分类
可以使用方括号来建立自己想匹配的正则表达式,格式为[匹配模式]
(1)也可以使用短横线来划定范围,比如[0-99a-zA-Z],表示为从0到99,从a到z的所有小写字母,A到Z的所有大写字母
(2)在方括号内,普通的正则表达式符号不会被解释,不需要加转义字符,可以直接使用,例如 [0-5,]不需要这样写,直接写为[0-5,]
(3)还可以使用
^
来表达非字符类,比如[^ban]来表示为匹配除ban以外的字符
(1)效果图
(2)效果图
(3)效果图
1.8插入字符和美元字符
插入字符
^
表示模式从文本开始处匹配,美元字符
$
表示文本以该模式结束,插入字符和美元字符同时使用意味着该文本等于该正则表达式,如果不匹配则不返回
以$为结尾的正则表达式
同时以^和$结尾的正则表达式
正则表达式 '^\d+$'表示整个文本为数字
1.9 通配字符
在正则表达式中,
.
(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。. 字符只能代替一个字符
1.9.1 .* 匹配所有字符串
(星号)表示
以前的字符出现零次或多次,.(句号)表示匹配除换行外的所有字符,即匹配所有字符串
注意大小写
(.
?)意味匹配尽可能小的模式
<.
>意为“匹配一个左尖括号,接下来是任意字符,接下来是一个右尖括号”,匹配尽可能多的模式。加问号匹配尽可能少的模式
1.9.2 利用句点字符匹配换行(re.DOTALL)
如果不加re.DOTALL,则只匹配换行符以前的。加re.DOTALL后,则匹配所以字符串
1.10 大小写不区分的匹配
在验证图片中字母的时候,只涉及匹配字母,不关心它们是大写或小写。要让正则表达式 不区分大小写,可以向 re.compile()传入 re.IGNORECASE 或 re.I,作为第二个参数。
1.11 利用sub()方法替换字符串
正则表达式不但可以找到文本模式,而且可以用新的文本替换掉这些模式。Regex 对象的 sub()方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,即 正则表达式,用于匹配需要找到的字符串。sub()方法返回替换完成后的字符串。
1.12管理复杂的正则表达式
如果要匹配的文本模式很简单,正则表达式就很好。但匹配复杂的文本模式, 可能需要长的、复杂的正则表达式。你可以告诉 re.compile(),忽略正则表达式字符串中的空白符和注释,从而缓解这一点。要实现这种详细模式,可以向 re.compile() 传入变量 re.VERBOSE,作为第二个参数。
例如:只需在正则表达式每行后面加 #注释即可
1.13 组合使用类似变量re.IGNORECASE,可以使用管道符