正则表达式

源自书《Python编程快速上手》 美·Al Sweigart 著 王海鹏译

1、用管道匹配多个分组

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

import re
res = re.match('Bat(man|mobile|copter|bat)',"Batmobile lost a wheel")
a = res.group()
b = res.group(1)
print(a)
print(b)
# >>>Batmobile
#>>>mobile
​

方法调用res.group()返回了完全匹配的文本“Batmobile”,而res.group(1)只是返回第一个括号分组内匹配的文本“mobil”。

通过使用管道字符和分组括号,可以指定几种可选的模式,让正则表达式去匹配。

如果需要使用真正的管道字符,需要先进行转义。

2、贪心匹配

在字符串"HaHaHaHaHa"中,因为(Ha){3,5}可以匹配3个、4个或者5个实例,但在Python中的正则表达式中,在有二义的情况下默认尽可能匹配最长的字符串。

如:

import re
res = re.match('(Ha){3,5}',"HaHaHaHaHaHaHaHa")
a = res.group()
print(a)
# >>>HaHaHaHaHa

注:

如果我们想取消这种贪心匹配的模式,只需要在结束的花括号后面跟着一个问号。如下程序所示:

import re
res = re.match('(Ha){3,5}?',"HaHaHaHaHaHaHaHa")
a = res.group()
print(a)
# >>>HaHaHa

3、findall()函数

3.1 findall()和search()的区别

search()函数:

输出被查找字符串中的第一次匹配的文本内容,返回的是一个match对象

findall()函数:

输出被查找字符串中的所有匹配的文本内容,返回的是一个字符串列表

3.2 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','9999'),('212','555','0000')]

4、限定开始或者结束和通配符

插入符号^:在正则表达式的开始用此符号,表示匹配必须发生在被查找文本开始处。

美元符号$:表示匹配必须以这个正则表达式的模式结束。

句点符号.:表示匹配一个任意字符(除了换行之外)。

5、用句点字符匹配换行符

点-星将匹配除换行符外的所有长度的所有字符。通过传入re.DOTALL作为re.complie()的第二个参数,可以让句点字符匹配所有的所有字符,包括换行符。

import re
NOW = re.compile('.*',re.DOTALL)
res = NOW.search("HaHaHaHa\nHaHaHaHalyy")
a = res.group()
print(a)
# >>>1:HaHaHaHa(此处换行符直接作换行处理)
# >>>2:HaHaHaHalyy

6、不区分大小写的匹配

可以通过传入re.I(大写的i)或者re.IGNORECASE作为re.complie()的第二个参数,可以不区分大小写匹配字符串。

7、用sub()方法替换字符串

可以通过传入re.sub(大写的i)作为re.complie()的第二个参数。

如下:

import re
now = re.compile('Agent \w+')
a = now.sub('CONSERD','Agent Alice gave the secret documents to Agent Bob.')
print(a)
# >>>CONSERD gave the secret documents to CONSERD.

8、管理复杂的正则表达式

告诉re.complie()忽略正则表达式字符串中的空白符和注释,从而缓解这一点。

要实现这种详细模式,可以向re.compile()传入变量re.VERBOSE,作为第二个参数。

phoneRegex = re.compile(r'((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)')

我们可以将上面的表达式放在多行中,并加上注释,像这样:

phoneRegex1 = re.compile(r'''(
(\d{3}|\(\d{3}\))?
(\s|-|\.)?
\d{3}
(\s|-|\.)
\d{4}
(\s*(ext|x|ext.)\s*\d{2,5})?)''',re.VERBOSE
)
#area code      电话地区号
#separator      分隔符
# first 3 digits        前3位数字
# separator     分隔符
# last 4 digits         后4位数字
# extension     电话分机

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值