一. re模块
-
- 额外:
- 几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
- re.I(re.IGNORECASE): 忽略大小写
- re.M(MULTILINE): 多行模式,改变’^’和’$’的行为
- re.S(DOTALL): 点任意匹配模式,改变’.’的行为
- re.L(LOCALE): 使预定字符类 w W B s S 取决于当前区域设定
- re.U(UNICODE): 使预定字符类 w W B s S d D 取决于unicode定义的字符属性
- re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释
- re.findall(pattern, string, flags=0) 功能是根据pattern 筛选出string中所有匹配的内容。返回值是一个列表。
# 正常匹配
s = "zhangsan lisi wanger mazi"
ret = re.findall('an', s,) # 返回匹配的内容
print(ret) # 列表 :['an', 'an', 'an']
# flags
s = "zhAngsan lisi wAnger mazi"
ret = re.findall('an', s, re.I)
print(ret) # ['An', 'an', 'An']
# findall优先级:
import re
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['www.oldboy.com']
- re.match(pattern, string, flags=0) 功能: 与search作用一致, 但是它是在字符串起始处开始匹配,倒是和startswith比较像, 返回值是一个对象 .需要 .group() 来获取值。 注意:如果没有匹配的内容则返回None
s = "zhangsan lisi wAnger mazi"
ret = re.match('zh', s) # 返回值,<_sre.SRE_Match object; span=(0, 2), match='zh'>
print(ret.group())
s = "zhangsan lisi wAnger mazi"
ret = re.match('an', s)
print(ret) # None
print(ret.group()) # 报错
- re.subn(pattern, repl, string, count=0, flags=0) 替换,替换匹配成功的内容。 返回值是一个元组,(string, 替换次数)
- re.sub(pattern, repl, string, count=0, flags=0) 与subn作用一致, 只是返回值不同,sub返回值是字符串。
# subn
s = "zhAngsan lisi wAnger mazi"
ret = re.subn('A', 'a', s, 1) # 1- count 指定替换次数
print(ret) # ('zhangsan lisi wanger mazi', 2)
s = "zhAngsan lisi wAnger mazi"
def demo():
return 'a'
ret = re.subn('A', demo(), s) # repl 可以用函数返回值
print(ret) # ('zhangsan lisi wanger mazi', 2)
# sub
s = "zhAngsan lisi wAnger mazi"
def demo():
return 'an'
print(re.sub('An', demo(), s, 1)) # zhangsan lisi wAnger mazi
- re.complie(pattern, flags=0) 功能: 与内置函数complie很像, 将正则表达式规则编译成一个正则表达式对象
obj = re.compile('d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123
- re.finditer(pattern, string, flags=0) 功能: 根据pattern筛选所有的匹配内容。与findall作用很相似,只是返回值不同,finditer返回值是一个迭代器。
s = "zhangsan lisi wanger mazi"
ret = re.finditer('an', s)
print(ret) # <callable_iterator object at 0x028A85B0>
# print(next(ret)) # <_sre.SRE_Match object; span=(2, 4), match='an'>
print(next(ret).group()) # an next后 .group()
for itr in ret:
print(itr.group()) # an an
- re.search(pattern, string, flags=0) 功能: 根据pattern 筛选出string中第一个匹配项,并返回。 返回值:如果能找到匹配项,返回值是一个对象;如果找不到匹配项,返回值是None
s = "zhangsan lisi wanger mazi"
print(re.search('an', s).group()) # an
- re.split(pattern, string, maxsplit=0, flags=0) 功能:根据pattern 分割string 。 返回值是列表。
s = "zhangsan|lisi|wanger|mazi"
ret = re.split(r'|', s)
print(ret) # ['zhangsan', 'lisi', 'wanger', 'mazi']
ret = re.split(r'|', s, 1) # maxsplit=1,指定分割次数
print(ret) # ['zhangsan', 'lisi|wanger|mazi']
# re.split()优先级:
s = "zhangsan|lisi|wanger|mazi"
ret1 = re.split(r'|', s)
print(ret1) # ['zhangsan', 'lisi', 'wanger', 'mazi'] 没有保留用来分割的匹配项。
ret2 = re.split(r'(|)', s)
print(ret2) # ['zhangsan', '|', 'lisi', '|', 'wanger', '|', 'mazi']
# 匹配规则加括号,可以保留用来分割的匹配项。
二. 正则表达式
- 元字符
-
# .(点) 匹配除换行符以外的任意字符
# w 匹配字母或数字或下划线
# s 匹配任意的空白符
# d 匹配数字
# W 匹配非字母或数字或下划线
# S 匹配非空白字符
# D 匹配任意非数字
#
匹配一个换行符
# 匹配一个制表符
# 匹配一个单词的结尾
# ^ 匹配字符串的开始
# $ 匹配字符串的结尾
# a|b 匹配a或b
# (..) 匹配括号内的表达式,也表示一个组
# [..] 匹配字符组中的字符
# [^..] 匹配非字符组中的字符
- 量词
-
# * 重复零次或更多次
# + 重复一次或更多次
# ? 重复零次或一次
# {n} 重复n次
# {n, } 重复n次或更多次
# {n,m} 重复n到m次
- 贪婪匹配,非贪婪匹配
- 如上量词默认都是贪婪匹配
- 非贪婪匹配: 在量词后面加上? 即可改变成非贪婪模式
-
# *? 重复任意次,但尽可能少重复
# +? 重复1次或更多次,但尽可能少重复
# ?? 重复0次或1次,但尽可能少重复
# {n,m}? 重复n到m次,但尽可能少重复
# {n,}? 重复n次以上,但尽可能少重复
- .*? 的用法
-
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x
就是取前面任意长度的字符,直到一个x出现
- ?的用法:
-
-
量词 : 量词: 代表重复零次或者1次
findall优先级: (?:) 可以取消优先级
非贪婪模式: 在贪婪模式的量词后面加? 可以改为非贪婪模式
定义组名(..) : 在(?P<组名>)可以定义组名