正则表达式模块:re
Python中的所有正则表达式函数都在re模块中
Regex对象:
Regex 对象的 search()方法查找传入的字符串, 寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式, search()方法将返回 None。如果找到了该模式,search()方法将返回一个 Match 对象。 Match 对象有一个 group()方法,它返回被查找字符串中实际匹配的文本(稍后我会解释分组)。
search()方法:
Python 中使用正则表达式步骤如下:
1、 用 import re 导入正则表达式模块
2、 用 re.compile()函数创建一个 Regex 对象(记得使用原始字符串)
3、 向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象
4、 调用 Match 对象的 group()方法,返回实际匹配文本的字符串
例如:
import re#导入正则表达式模块
test = input(‘请输入要查询的文本:\n’)
phonenumberRegex=re.compile(r’\d\d\d-\d\d\d-\d\d\d\d’)#正则表达式查找电话号码匹配的格式
mo = phonenumberRegex.search(test)#查找带查找的文本,查找到,则返回结果到search的math对象里面,没找到,则返回none
print(‘查到的电话号码是:’ + mo.group())#打印查找到的电话号码
模式匹配与正则表达式
利用括号进行分组:
正则表达式字符串中的第一对括号是第 1 组。第二对括号是第 2 组。向 group()匹配对象方法传入整数 1 或 2, 就可以取得匹配文本的不同部分。 向 group()方法传入 0 或不传入参数, 将返回整个匹配的文本。
例如:
print(‘查到的电话号码区号是:’ + mo.group(1))#打印第一个分组
print(‘查到的电话号码尾号是:’ + mo.group(2))#打印第二个分组
打印所有分组,并保存在元组里面
print(mo.groups())#打印所有分组,并保存在元组里面
a,b = mo.groups()#元组的多重复制技巧,每个值赋给一个独立的变量
print(a)
print(b)
括号在正则表达式中有特殊的含义,在文本中匹配括号,需要用倒斜杠对(和)进行字符转义,(和)转义字符将匹配实际的括号字符
例如:
import re#导入正则表达式模块
test = ‘My number is (415)-555-4242.’
phonenumberRegex=re.compile(r’((\d\d\d))-(\d\d\d-\d\d\d\d)’)# 需要匹配()字符时,使用()来表示
mo = phonenumberRegex.search(test)#查找带查找的文本,查找到,则返回结果到search的math对象里面,没找到,则返回none
print(‘查到的电话号码区号是:’ + mo.group(1))#打印第一个分组
print(‘查到的电话号码尾号是:’ + mo.group(2))#打印第二个分组
管道匹配多个分组:字符|称为“管道”。用于匹配多个表达式中的一个分组,如果同时存在多个表达式都出现在被查找的字符串中,第一次出现的匹配文本,将作为 Match 对象返回。
test1 = ‘hello world!’
zifuRegex = re.compile(r’hello|world’)#使用管道|匹配多个字符
result = zifuRegex.search(test1)
print(result.group())
问号实现可选匹配, 不论这段文本在不在, 正则表达式都会认为匹配。字符?表明它前面的分组在这个模式中是可选的。即正则表达式中的(wo)?部分表明, 模式 wo 是可选的分组。
test1 = ‘hello world!’
testRegex = re.compile(r’hel(lo)? world’)
result1 = testRegex.search(test1)
print(result1.group())
星号匹配零次或多次, *(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复。
test1 = ‘hello world!’
test2 = ‘hello abababab world’
testRegex1 = re.compile(r’hello (ab)* world’)#注意空格与原字符串空格的个数,*可以匹配多次或零次
result1 = testRegex1.search(test1)
result2 = testRegex1.search(test2)
print(result1.group())
print(result2.group())
加号匹配一次或多次, +(加号) 则意味着“匹配一次或多次”。加号前面的分组必须“至少出现一次”。这不是可选匹配。
test1 = ‘hello world!’
test2 = ‘hello abababab world’
testRegex1 = re.compile(r’hello (ab)+ world’)#注意空格与原字符串空格的个数,+可以匹配一次或多次
result1 = testRegex1.search(test1)
result2 = testRegex1.search(test2)
print(result1 == None) #没有匹配到,结果为None
print(result2.group())
花括号匹配特定次数,正则表达式(Ha){3}将匹配字符串’HaHaHa’,可以指定一个范围,正则表达式(Ha){3,5}将匹配’HaHaHa’、 ‘HaHaHaHa’和’HaHaHaHaHa’。也可以不写花括号中的第一个或第二个数字, 不限定最小值或最大值。例如,正则表达式(Ha){3,}将匹配 3 次或更多次实例,正则表达式(Ha){,5}将匹配 0 到 5 次实例。
正则表达式(Ha){3,5}默认返回最长字符’HaHaHaHaHa’,正则表达式(Ha){3,5}?可以返回最短字符’HaHaHa’
test1 = ‘hello world!’
test2 = ‘hello abababab world’
testRegex1 = re.compile(r’hello (ab){2,4} world’)#注意空格与原字符串空格的个数,{}可以匹配指定次数
result1 = testRegex1.search(test1)
result2 = testRegex1.search(test2)
print(result1 == None)#没有匹配到,结果为None
print(result2.group())
findall()方法:
除了search方法外, Regex对象也有一个findall()方法。search()将返回一个Match对象, 包含被查找字符串中的“第一次” 匹配的文本,而 findall()方法将返回一组字符串, 包含被查找字符串中的所有匹配。
findall()方法的返回结果,请记住下面两点:
1. 如果调用在一个没有分组的正则表达式上, 例如\d\d\d-\d\d\d-\d\d\d\d, 方法findall()将返回一个匹配字符串的列表, 例如[‘415-555-9999’, ‘212-555-0000’]。
2. 如果调用在一个有分组的正则表达式上, 例如(\d\d\d)-(\d\d\d)-(\d\d\d\d), 方法 findall()将返回一个字符串的元组的列表(每个分组对应一个字符串), 例如[(‘415’,‘555’, ‘1122’), (‘212’, ‘555’, ‘0000’)]
test = ‘My number is 415-555-4242.call number is 028-666-6868’
testRegex1 = re.compile(r’\d\d\d-\d\d\d-\d\d\d\d’)
result1 = testRegex1.findall(test)#findall调用在没有分组的正则表达式上,返回字符串列表
print(result1)
testRegex2 = re.compile(r’(\d\d\d)-(\d\d\d)-(\d\d\d\d)’)
result2 = testRegex2.findall(test)#findall调用在分组的正则表达式上,返回包含元组的字符串列表
print(result2)
字符分类:
缩写字符分类 表示
\d 0 到 9 的任何数字
\D 除 0 到 9 的数字以外的任何字符
\w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
\W 除字母、数字和下划线以外的任何字符
\s 空格、制表符或换行符(可以认为是匹配“空白”字符)
\S 除空格、制表符和换行符以外的任何字符
(\d+)匹配的文本有一个或多个数字, (\s)匹配的是一个空白字符, (\w+)匹配的是一个或多个字母/数字/下划线字符
xmasRegex = re.compile(r’\d+\s\w+’)
result = xmasRegex.findall(‘12 drummers, 11 pipers, 10 lords, 9 ladies, 8 maids, 7 swans, 6 geese, 5 rings, 4 birds, 3 hens, 2 doves, 1 partridge’)
print(result)
自定义字符
1357

被折叠的 条评论
为什么被折叠?



