首页 > 代码库 > 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}),rMy 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}),rMy 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}),rMy 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(rlaowang|xiaozhang,We team include laowang and xiaozhang.)
print(name.group()) #第一个先匹配到谁,谁将作为Match对象返回

输出:
laowang

使用管道来匹配多个模式中的一个

import re
name = re.search(rlao(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(rlao(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模块