【Python】正则表达式 re 模块

核心函数和方法

  • compile 模块函数,对正则表达式进行预编译
  • match
  • search
  • group、groups

compile

python 的代码最终会被编译为字节码,然后才会被解释器执行,比如 eval 或者 exec 调用的代码对象,在性能上会明显提升。
这个概念也适用于正则表达式,在模式匹配前,正则表达模式先被编译成 regex 对象,由于正则表达式一般会进行多次比较,所以强烈建议先对它进行预编译。
re.compile()就是用来提供编译功能的。

match

re.match() 函数尝试从字符串的开头开始对模式进行匹配,如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回 None。

m = re.match('foo', 'foo')
if m is not None:
	print(m.group())
	
>>> foo

从示例中可以看出,foo 完全匹配,所以 m 是一个匹配对象的实例,当匹配失败时,返回一个 None

m = re.match('foo', 'bar')
print(m.group())

>>> Traceback (most recent call last):
AttributeError: 'NoneType' object has no attribute 'group'

由于 None 并不是一个匹配对象,没有 group() 方法,所以抛出 AttributeError 异常,因此在第一个示例中 if m is not None 就是用来规避由于匹配失败报错的。

匹配对象和 group()、groups()

通过上面例子,我们初步认识了匹配对象,在处理正则表达式时,match() 或 search() 被成功调用之后所返回的结果,就是匹配对象。
匹配对象有两个主要方法:group() 和 groups()。

group() 方法返回所有匹配对象,或者根据要求返回某个特定子组。
groups() 方法返回一个包含唯一或者所有子组的元组

如果正则表达式中没有子组的话,groups 将返回一个空元组,而 group 仍会返回全部匹配对象。

search

search 与 match 工作方式一样,不同之处在于 search 会检查参数字符串任意位置的地方,而不是从起始处去匹配。严格的说,search() 是从左到右进行搜索。

# 使用 match 匹配失败
m = re.match('foo', 'seafood')
if m is not None: print(m.group())

>>> 

# 使用 search 匹配成功
m = re.search('foo', 'seafood')
if m is not None: print(m.group())

>>> foo

正则匹配示例

匹配多个字符串(|)

管道符号代表逻辑或的意思

p = 'happy|test|demo'

# 匹配成功
m = re.match(p, 'test')
if m is not None: print(m.group())
>>> test

# 匹配失败
m = re.match(p, 'iamok')
if m is not None: print(m.group())
>>> 

# search 匹配成功
m = re.search(p, 'python demo')
if m is not None: print(m.group())	
>>> demo

匹配任意单个字符(.)

p = '.end'

print(re.match(p, 'bend').group())
>>> 'bend'

print(re.match(p, 'end').group())  # 未匹配
>>> AttributeError ...

print(re.match(p, '\nend').group())  # 不匹配 \n
>>>

print(re.match(p, 'The end').group())
>>> ' end'

p1 = '3.14'
p2 = '3\.14'

print(re.match(p1, '3.14').group())
>>> 3.14

print(re.match(p1, '3514').group())  # p1 匹配成功
>>> 3514

print(re.match(p2, '3514').group())  # p2 匹配失败
>>> AttributeError ...

创建字符合集([])

print(re.match('[ab][12][cd][34]', 'a1c3').group())
>>> 'a1c3'

print(re.match('[ab][12][cd][34]', 'b2c4').group())
>>> 'b2c4'

print(re.match('ab12|cd34', 'b2c4').group())
>>> AttributeError ...

注意字符集合与 | 不一样。

重复、特殊字符和子组

453

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值