一. re模块
-
re模块下的常用方法
-
-
额外:
-
几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
- re.I(re.IGNORECASE): 忽略大小写
- re.M(MULTILINE): 多行模式,改变’^’和’$’的行为
- re.S(DOTALL): 点任意匹配模式,改变’.’的行为
- re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
- re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
- re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释
-
几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
-
额外:
- 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, 替换次数)
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)
- re.sub(pattern, repl, string, count=0, flags=0) 与subn作用一致, 只是返回值不同,sub返回值是字符串。
- 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 匹配任意非数字 # \n 匹配一个换行符 # \t 匹配一个制表符 # \b 匹配一个单词的结尾 # ^ 匹配字符串的开始 # $ 匹配字符串的结尾 # 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<组名>)可以定义组名
-