re:模块

模块的引用

import re

  :为.py文件取名时不能与模块的名字相同

re模块中的查找

findall

匹配所有条件相匹配,每一项都是列表中的元素

import re
ret = re.findall(r"\d+", "大123家78好!")
print(ret)
运行结果:
['123', '78']

search

匹配从左到右的第一个结果,得到的是一个变量,通过这个变量的group()方法来获结果

ret = re.search(r"\d+", "大123家78好!")
print(ret)
print(ret.group())
运行结果:
<_sre.SRE_Match object; span=(1, 4), match='123'>
123

需要注意的是若是没有匹配结果,就会报错,因此常用if做判断,再进行打印

ret = re.search(r"\d+", "大123家78好!")
if ret:
    print(ret.group())

match

从头开始匹配,相当于search的正则表达式的开头加入  ^  规则

ret = re.match(r"\d+", "大123家78好!")
print(ret)
ret = re.match(r"\d+", "123家78好!")
print(ret)
print(ret.group())
运行结果:
None
<_sre.SRE_Match object; span=(0, 3), match='123'>
123

re模块中的切割与替换

split

与字符串的切割类似,切割条件去除,且以切割条件结尾的话会,结果中会出现一个空(" ")

ret = re.split(r"\d+", "大123家78好!")
print(ret)
ret = re.split(r"\d+", "大123家78好!9")
print(ret)
运行结果:
['', '', '好!']
['', '', '好!', '']

sub与subn

sub("正则a","b","内容",n)

subn("正则a","b","内容")

sub与subn几乎相同,只是subn可以现出替换的次数,

用法是:将规则a的匹配内容换成b,n是想要替换的次数

ret = re.sub(r"\d+", "!", "大123家78好")
print(ret)
ret = re.subn(r"\d+", "!", "大123家78好")
print(ret)
ret = re.sub(r"\d+", "!", "大123家78好", 1)
print(ret)
运行结果:
大!家!好
('大!家!好', 2)
大!家78好

compile节省时间

compile可以节省使用正则表达式解决问题的时间,她是将正则表达式编译成字节码,这样在多次使用时就不需要多次编译了.

ret = re.compile(r"\d+")
print(ret)
print(ret.findall("大123家78好!"))
print(ret.search("大123家78好!").group())
运行结果:
re.compile('\\d+')
['123', '78']
123

finditer节省空间

可以节省使用正则表达式时所占用的内存

finditer返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值因此能够节省内存

ret = re.finditer(r"\d+", "大123家78好!")
print(ret)
for i in ret:
    print(i.group())
运行结果:
<callable_iterator object at 0x000000000256EFD0>
123
78

分组在re模块中的应用

findall分组

findall为了可以顺利取到分组中的内容,有一个特殊的语法,就是优先显示分组中的内容

s = '<a>wahaha</a>'
ret = re.findall(r">\w+<", s)
print(ret)
ret = re.findall(r">(\w+)<", s)
print(ret)
运行结果:
['>wahaha<']
['wahaha']

?:正则表达式可以取消分组优先

ret = re.findall(r"\d(.\d+)?", "1.23*4")
print(ret)
ret = re.findall(r"\d(?:.\d+)?", "1.23*4")
print(ret)
运行结果:
['.23', '']
['1.23', '4']

search分组

group()中数字参数代表的是取对应分组中的内容,不加参数默认为0代表的是全部匹配的内容

s = '<a>wahaha</a>'
set = re.search(r"<(\w+)>"r"(\w+)"r"</(\w+)>", s)
print(set.group())
print(set.group(0))
print(set.group(1))
print(set.group(2))
print(set.group(3))
运行结果:
<a>wahaha</a>
<a>wahaha</a>
a
wahaha
a

split分组

split应用分组时会保留切割条件

ret = re.split('\d+', 'alex83taibai40egon25aa')
print(ret)
ret = re.split('(\d+)', 'alex83taibai40egon25aa')
print(ret)
运行结果:
['alex', 'taibai', 'egon', 'aa']
['alex', '83', 'taibai', '40', 'egon', '25', 'aa']

分组命名

?P<这个组的名字>正则表达式

s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<', s)
print(ret.group(1))
print(ret.group('con'))
运行结果:
wahaha
wahaha

判断标签的头尾是否一致

s = '<a>wahaha</a>'
pattern = '<(\w+)>(\w+)</(\w+)>'
ret = re.search(pattern, s)
print(ret.group(1) == ret.group(3))

# 使用前面的分组 要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致
pattern_new = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern_new, s)
print(ret)

运行结果:
True
<_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>
当所取的内容没有太大的区分特点时容易和你不想匹配的内容混在一起,可以使用分组的优先取值
ret = re.findall(r"\d+", "1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret = re.findall(r"\d+\.\d+|(\d+)", "1-2*(60+(-40.35/5)-(-4*3))")
ret.remove('')
print(ret)
运行结果:
['1', '2', '60', '40', '35', '5', '4', '3']
['1', '2', '60', '5', '4', '3']
 

猜你喜欢

转载自www.cnblogs.com/jiaqi-666/p/9494482.html