python中如何使用正则表达式

       正则表达式, 简称为 regex, 是文本模式的描述方法。Python 中所有正则表达式的函数都在 re 模块中,在Python中使用正则表达式时都需要导入re模块,否则就会遇到错误消息 NameError: name 're' is not defined。

一、创建正则表达式对象

      向 re.compile()传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式对象(或者就简称为 Regex 对象)。

二、匹配Regex 对象

       Regex 对象的 search()方法查找传入的字符串, 寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式, search()方法将返回 None。如果找到了该模式,search()方法将返回一个 Match 对象。 Match 对象有一个 group()方法,它返回被查找字符串中实际匹配的文本。

总之,Python 中使用正则表达式有几个步骤:
1.用 import re 导入正则表达式模块。
2.用 re.compile()函数创建一个 Regex 对象(记得使用原始字符串,即通过在字符串的第一个引号之前加上 r,可以将该字符串标记为原始字符串,它不包括转义字符)。
3.向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象。
4.调用 Match 对象的 group()方法,返回实际匹配文本的字符串。

#正则表达式查找电话号码

#coding:utf-8
import re
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('my phoneNumber is 139-1234-5678.')
print('Phone number found: '+mo.group())

#输出结果
Phone number found: 139-1234-5678

 三、正则表达式的模式匹配

1、使用括号分组模式匹配

     添加括号在正则表达式中创建“ 分组”:如上例中的电话号码分组(\d\d\d)-(\d\d\d)-(\d\d\d\d),然后可以使用 group()匹配对象方法,从一个分组中获取匹配的文本。正则表达式字符串中的第一对括号是第 1 组,第二对括号是第 2 组,依次类推。向 group()匹配对象方法传入整数,即要匹配文本的组号, 就可以取得匹配文本的不同部分。 向 group()方法传入 0 或不传入参数, 将返回整个匹配的文本。如果想要一次就获取所有的分组, 请使用 groups()方法, 注意函数名的复数形式,groups()返回数据类型为元祖。

#coding:utf-8
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d\d)-(\d\d\d\d)')
#print(phoneNumRegex)
mo = phoneNumRegex.search('my phoneNumber is 139-1234-5678.')
print(mo.group(2,3))
print(type(mo.groups()))

#返回结果
('1234', '5678')
<class 'tuple'>

如果需要在文本中匹配括号,例如, 你要匹配的电话号码, 可能将区号放在一对括号中。在这种情况下, 就需要用“\”对"("和")"进行字符转义。

2、用管道(|)匹配多个分组

      字符|称为“ 管道”。希望匹配许多表达式中的一个时, 就可以使用它。

#coding:utf-8
import re
nameRegex = re.compile(r'张三|张思')
mo = nameRegex.search('张三是我朋友')
print(mo.group())

#输出结果
张三

上例中正则表达式 ‘张三|张思’ 将匹配 ‘张三’ 或者 ‘张思’,如果 张三 和 李思 都出现在被查找的字符串中, 第一次出现的匹配文本,将作为 Match 对象返回。也可以使用管道来匹配多个模式中的一个, 作为正则表达式的一部分。

#coding:utf-8
import re
nameRegex = re.compile(r'张(三|思)')
mo1 = nameRegex.search('张思和张三是我的朋友')
print(mo1.group())
print(mo1.group(1))

#输出结果
张思          
思

输出结果1:要查找名字都在被查找字符串中,根据匹配第一次出现的原则,返回张思这个名字。

输出结果2:mo.group(1)返回第一个括号分组内(三|思)匹配的文本‘思’,使用了按照括号分组的模式匹配。

如果需要匹配真正的管道字符, 就用倒斜杠转义,即\|。

3、使用问号(?)实现可选匹配

       在实际应用中, 想匹配的模式是可选的。即不论这段文本在不在, 正则表达式都会认为匹配。字符?表明它前面的分组在这个模式中是可选的。

4、用星号(*)匹配零次或者多次

        *( 称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复。

5、用加号(+)匹配一次或者多次

       *意味着“ 匹配零次或多次”, +(加号) 则意味着“ 匹配一次或多次”。 星号不要求分组出现在匹配的字符串中, 但加号不同, 加号前面的分组必须“ 至少出现一次”。这不是可选的。
6、用花括号匹配特定次数

        1)如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例如(张三){3},匹配到的字符串为‘张三张三张三’。

        2)还可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值。例如(张三){1,2},匹配到的字符串是“张三”,“张三张三”。

        3)也可以不写花括号中的第一个或第二个数字, 不限定最小值或最大值。例如(张三){3,}匹配的字符串3次或者等多次,(张三){,5}匹配字符串0-5次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值