Python模块之re模块

一: re.findall

def findall(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:


返回结果:如果能够匹配到字符串,会将所有匹配到的字符串形成一个列表,然后返回,如果匹配不到,则返回一个空列表
import re
ret1=re.findall('[a-z]+','wangys wc')
ret2 =re.findall('[0-9]','wangys')
print(ret1)
print(ret2)

# 结果
['wangys', 'wc']
[]

使用分组匹配的时候要注意优先级匹配,需要将优先级取消,才能取得正确的值

import re

# 正常匹配
ret=re.findall('d+ww+','123wangys')
print(ret)
# ['123wangys']

# 使用分组正常匹配
ret1=re.findall('d+(ww+)','123wangys')
print(ret1)
# ['wangys']  # 结果不正常

# 使用分组匹配取消优先级匹配  ?:取消优先级
ret1=re.findall('d+(?:ww+)','123wangys')
print(ret1)
['123wangys']

二:re.search

def search(pattern, string, flags=0):
pattern: 正则表达式
string: 要匹配的字符串
flag:

返回结果: 通过正则表达式匹配字符串,如果有匹配到一个就返回,返回的结果是包含匹配的字符串的对象,字符串可以使用group()的方法取得,如果没有匹配到返回None,在使用group方法时会报错


import re
ret1=re.search('[a-z]+','wangys,xiaogongzu')
print(ret1)
print(ret1.group())

# <_sre.SRE_Match object; span=(0, 6), match='wangys'>  # 如果匹配到就返回一个对象
# wangys  # 使用group方法可以得到这个匹配结果,从结果上看,确实时第一个匹配结果会返回,后续的不会做为返回值返回


ret2=re.search('d+','wangys,xiaogongzu')
print(ret2)
print(ret2.group())

#None # 如果匹配不到就返回None
# AttributeError: 'NoneType' object has no attribute 'group' # 当使用group方法会报错
# 在输出字符串之前使用group之前对结果进行判断
# 要么返回一个对象,要不返回None,
# None为false

import re
ret = re.search('[a-z]+','wangys anyl')
if ret:
    print(ret.group())

ret = re.search('[0-9]+','wangys anyl')
if ret:
    print(ret.group())

 三:re.match

match(pattern, string, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
flag:
返回结果: 从字符串开始做匹配,跟search一样

ret1=re.match('[a-z]+','wangys,xiaogongzhu')
print(ret1)
print(ret1.group())

# <_sre.SRE_Match object; span=(0, 6), match='wangys'>
# wangys

ret2=re.match('[a-v]+','wangys,xiaogongzhu')
print(ret2)
print(ret2.group())

# None
# AttributeError: 'NoneType' object has no attribute 'group'

同样为了防止报错,当使用group方法取出匹配的字符串时,要判断返回值是否为None

四:re.split

split(pattern, string, maxsplit=0, flags=0)
pattern: 正则表达式
string: 要匹配的字符串
maxsplit:
flag:

函数 re.split() 是非常实用的,因为它允许你为分隔符指定多个正则模式, 返回结果为一个字段列表,这个跟 str.split() 返回值类型是一样的
当你使用 re.split() 函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。 如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中



返回结果:将使用正则表达式将字符串分隔。
import re
ret1 = re.split('[a-z]+','sdfasdf123sdfasf')
print(ret1)
['', '123', '']

在使用分组匹配分隔是,会将分隔符也匹配进去

import re
ret1=re.split('d','1wang4ys5')
print(ret1)
# ['', 'wang', 'ys', '']  返回结果不会带有被匹配的字符串

ret1=re.split('(d)','1wang4ys5')
print(ret1)
# ['', '1', 'wang', '4', 'ys', '5', ''] 分组后也会将被匹配的字符串返回

多个分隔符时效果更佳(字符串的split方法只支持 单个分隔符)

import re
line = 'asdf fjdk; afed, fjek,asdf, foo'
result = re.split(r'[;,s]s*', line)
print(result)
result = re.split(r'(?:;|,|s)s*', line)
print(result)

五:re.sub

sub(pattern, repl, string, count=0, flags=0)

pattern: 正则表达式
repl: 要替换的字符串
string: 要匹配的字符串
count:
flag:

 用于字符串替换

import re
ret = re.sub('d+','wangys','123wangys')
print(ret)

# 将匹配到的数字替换成字符串‘wangys’

 六 re.subn

subn(pattern, repl, string, count=0, flags=0)
pattern: 正则表达式
repl: 需要替换的字符串
string: 要匹配的字符串
count:
flag:

返回结果:替换字符串,并将结果和替换次数组成一个元祖的形式返回

import re
ret=re.subn('d','H','123wangys')
print(ret)
# ('HHHwangys', 3)
import re
obj = re.compile('d{3}')  # 将正则表达式编译成了一个正则对象
ret = obj.findall('wangys123yl456') # 使用该对象匹配字符串
print(ret) # 返回结果

7: re.finditer

finditer(pattern, string, flags=0)

pattern: 正则表达式
string: 要匹配的字符串
flag:

返回结果是一个迭代器,取出的值是对象,不是真正的字符串,需要使用group方法取到
import re
ret = re.finditer('[a-z]+','wangys123xiao')
print(ret)
for i in ret:
    print(i)

# <callable_iterator object at 0x0000027B7C12D2B0>返回结果是一个可调用的迭代器对象
# <_sre.SRE_Match object; span=(0, 6), match='wangys'>
# <_sre.SRE_Match object; span=(9, 13), match='xiao'>

import re
ret = re.finditer('[a-z]+','wangys123xiao')
print(ret)
for i in ret:
    print(i.group())

# <callable_iterator object at 0x0000024A15E9D2E8>
# wangys
# xiao
flags有很多可选值:

re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

 八:练习题

import re
name = "<h1>hello</h1>"
# ret = re.search('<w+>w+</w+>',name)
ret = re.search('<(?P<tag_name>w+)>w+</(?P=tag_name)>',name)
print(ret.group())
print(ret.group('tag_name'))  # 可以输出tag_name这个分组的值是多少
# 使用序号来应用分组匹配
import re
name = "<h1>hello</h1>"
ret = re.search(r'<(w+)>w+</1>',name)
print(ret.group())
print(ret.group(1)) # 可以通过组id取出匹配的字符串
1、 匹配一段文本中的每行的邮箱
http://blog.csdn.net/make164492212/article/details/51656638

2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;

分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,}

4、 匹配一个浮点数。 ^(-?d+)(.d+)?$ 或者 -?d+.?d*

5、 匹配汉字。 ^[u4e00-u9fa5]{0,}$

6、 匹配出所有整数
实现能计算类似 
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序






原文地址:https://www.cnblogs.com/wc89/p/10313499.html