欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则模块re

程序员文章站 2022-07-13 12:40:57
...

#!/usr/bin/env python

-- coding:utf-8 --

print(’\\n’)

print(’\n’)

print(r’\n’)

print(r’\n’)

正则表达式中的转义符在python的字符串中也刚好有转移的作用

但是正则表达式中的转义符和字符串中的转义符并没关系

且还容易有冲突

为了避免这种冲突

我们所有的正则都以在工具中的测试结果为结果

然后只需要在正则和待匹配的字符串外面都加r即可

#!/usr/bin/env python

-- coding:utf-8 --

import re

regex

ret = re.findall(’\d+’,‘alex83’)

print(ret)

findall 会匹配字符串中所有符合规则的项

并返回一个列表

如果未匹配到返回空列表

ret = re.search(’\d+’,‘alex83’)

print(ret) # 如果能匹配上返回一个对象,如果不能匹配上返回None

if ret:

print(ret.group()) # 如果是对象,那么这个对象内部实现了group,所以可以取值

# 如果是None,那么这个对象不可能实现了group方法,所以报错

会从头到尾从带匹配匹配字符串中取出第一个符合条件的项

如果匹配到了,返回一个对象,用group取值

如果没匹配到,返回None,不能用group

re.match

ret = re.match(’\d’,‘alex83’) == re.match(’^\d’,‘alex83’)

print(ret)

会从头匹配字符串中取出从第一个字符开始是否符合规则

如果符合,就返回对象,用group取值

如果不符合,就返回None

match = search + ^正则

#!/usr/bin/env python

-- coding:utf-8 --

进阶方法

1.时间复杂度 效率 compile

# 在同一个正则表达式重复使用多次的时候使用能够减少时间的开销

2.空间复杂度 内存占用率 finditer

# 在查询的结果超过1个的情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间复杂度

3.用户体验

import re

ret = re.findall(’\d’,‘safhl02urhefy023908’*20000000)

print(ret)

ret = re.finditer(’\d’,‘safhl02urhefy023908’*20000000) # ret是迭代器

for i in ret: # 迭代出来的每一项都是一个对象

print(i.group()) # 通过group取值即可

compile

s = ‘
.?
.?<em .?>(?P\d+).?(?P.*?)’ \

‘.?<span class=“rating_num” .?>(?P<rating_num>.?).?(?P<comment_num>.*?)评价

ret = re.compile(’\d3’)

print(ret)

r1 = ret.search(‘alex83’)

print(r1)

ret.findall(‘wusir74’)

ret = re.compile(’\d+’)

r3 = ret.finditer(‘taibai40’)

for i in r3:

print(i.group())

\d 正则表达式 ——> 字符串

# \d  str
    # 循环str,找到所有的数字

findall search

finditer compile

sub

split

import re

ret = re.split(’\d(\d)’,‘alex83wusir74taibai’) # 默认自动保留分组中的内容

print(ret)

ret = re.sub(’\d’,‘D’,‘alex83wusir74taibai’,1)

print(ret)

ret = re.subn(’\d’,‘D’,‘alex83wusir74taibai’)

print(ret)

findall 参数顺序和数据类型,返回值类型

search

match

finditer

compile

sub subn

split

#!/usr/bin/env python

-- coding:utf-8 --

s1 = ‘

wahaha


s2 = ‘wahaha ya wahaha

s1 -> h1 wahaha

s2 -> a wahaha ya wahaha

import re

ret = re.search(’<(\w+)>(.*?)</\w+>’,s1)

print(ret)

print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果

print(ret.group(1)) # 取第一个分组中的内容

print(ret.group(2)) # 取第二个分组中的内容

ret = re.search(’<(?P\w+)>(?P.*?)</\w+>’,s1)

print(ret)

print(ret.group(‘tag’)) # 取tag分组中的内容

print(ret.group(‘cont’)) # 取cont分组中的内容

分组命名

(?P<名字>正则表达式)

引用分组 (?P=组名) 这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样

s1 = ‘

wahaha

s2 = ‘wahaha ya wahaha

ret = re.search(’<(?P\w+)>.*?</(?P=tag)>’,s1)

print(ret.group(‘tag’))

s1 = ‘

wahaha

s2 = ‘wahaha ya wahaha

ret = re.search(r’<(\w+)>.*?</\1>’,s1)

print(ret.group(1))

import re

ret = re.findall(’\d(\d)’,‘aa1alex83’)

# findall遇到正则表达式中的分组,会优先显示分组中的内容

print(ret)

ret = re.findall(’\d+(?:.\d+)?’,‘1.234+2’)

print(ret)

分组

split

# 会保留分组中本来应该被切割掉的内容

分组命名

(?P<名字>正则) search group(‘组名’)

引用分组

(?P=组命) 表示这个组中的内容必须和之前已经存在的一组匹配到的内容完全一致

分组和findall

# 默认findall 优先显示分组内的内容
# 取消分组优先显示 (?:正则)

例题

# 有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉

import re

ret=re.findall(r"\d+.\d+|(\d+)",“1-2*(60+(-40.35/5)-(-4*3))”)

print(ret)

ret.remove(’’)

print(ret)