首页 > 代码库 > python学习-正则表示式及re模块
python学习-正则表示式及re模块
python中的所有正则表达式函数都在re模块中。import re导入该模块。
1,创建正则表达式对象
想re.compile()传入一个字符串值,表示正则表达式,它将返回一个Regex模式对象。
创建一个匹配手机号的(\d表示一个数字字符)
mphone_regex = re.compile(r‘\d\d\d-\d\d\d\d-\d\d\d\‘)
2,匹配正则表达式
regex对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search()方法返回None。如果找到该模式,search()方法返回一个Match对象,
Match对象有一个group()方法,它返回被查找字符串中实际匹配的文本,如下
import re mphone_regex = re.compile(r‘\d\d\d-\d\d\d\d-\d\d\d\d‘) mo = mphone_regex.search(‘My mobile Phone Number is 133-1111-1111.‘) print(‘number is:%s‘%mo.group()) 输出: number is:133-1111-1111
注意:字符串中的\n,\t分表表示换行、制表符,\是个转义字符,\\才表示一个\。如果在字符串的前面加上r,可以将该字符串标记为原始字符串,它不包括转移字符。
其顺序为:
- import re 导入re模块
- 用re.compile()创建一个Regex对象,最好带上r
- 想Regex对象的search()方法传入想查找的字符串。它返回一个Match对象
- 调用Match对象的group()方法,返回实际匹配文本的字符串
上面的也可以这样写:
import re mo = re.search(r‘\d{3}-\d{4}-\d{4}‘,‘My mobile Phone Number is 133-1111-1111‘) print(‘number is:%s‘%mo.group())
3,用括号分组
如果我只想要手机号的前三位怎么办?
import re mo = re.search(r‘(\d{3})-(\d{4}-\d{4})‘,r‘My mobile Phone Number is 133-1111-1111‘) #用()将正则表达式分成两组 print(‘number is:%s‘%mo.group()) #group()没有参数或者参数0表示整个匹配的文本 print(‘number is:%s‘%mo.group(0)) print(‘number is:%s‘%mo.group(1)) #1表示第一对括号匹配的内容 print(‘number is:%s‘%mo.group(2)) #1表示第一对括号匹配的
输出:
number is:133-1111-1111 number is:133-1111-1111 number is:133 number is:1111-1111
如果要一次获取所有的分组,就使用groups()。
import re mo = re.search(r‘(\d{3})-(\d{4}-\d{4})‘,r‘My mobile Phone Number is 133-1111-1111‘) #用()将正则表达式分成两组 print(mo.groups()) #groups返回包含多个值的元组 first,last = mo.groups() print(first) print(last) 输出: (‘133‘, ‘1111-1111‘) 133 1111-1111
那么问题来了,既然()在正则表达式中有特殊的含义,那么如何匹配文本中的()呢?使用\进行转移,\(内容\)
import re mo = re.search(r‘(\(\d{3}\))-(\d{4}-\d{4})‘,r‘My mobile Phone Number is (133)-1111-1111‘) #用()将正则表达式分成两组 print(mo.group()) print(mo.group(1)) 输出: (133)-1111-1111 (133)
4,使用管道匹配多个分组
比如laowang和xiaozhang都出现在被查找的字符串中,第一次出现的匹配文本,将作为Match对象返回。
import re name = re.search(r‘laowang|xiaozhang‘,‘We team include laowang and xiaozhang.‘) print(name.group()) #第一个先匹配到谁,谁将作为Match对象返回 输出: laowang
使用管道来匹配多个模式中的一个
import re name = re.search(r‘lao(wang|zhang|liu|luo|cc)‘,‘We team include laoliu,laoluo,laowang and laozhang.‘) print(name.group()) print(name.group(1)) 输出: laoliu liu
name.group()返回完全匹配的文本‘laoliu’,name.grop(1)只返回第一个括号分组中匹配到的文本‘liu’。可以使用管道和()组合去匹配。另外如果匹配真正的|,需要转意\|
import re name = re.search(r‘lao(wang|zhang|liu|luo|cc)-(er|san|si|wu)‘,‘We team include laoliu-qq,laoluo-er,laowang-sfs and laozhang.‘) print(name.group()) print(name.group(1)) print(name.group(2)) 输出: laoluo-er luo er
未完待续。。。。
python学习-正则表示式及re模块