元字符和其含义 . 匹配除换行符以外的任意字符 转义字符,使后一个字符改变原来的意思 w 匹配字母、数字、下划线:[A-Za-z0-9_] W 匹配特殊字符:[^A-Za-z0-9_] s 匹配任意的空白符:[<空格> fv] S 匹配非空白符 d 匹配数字 D 匹配非数字 匹配一个换行符 匹配一个制表符 匹配一个单词的结尾 * 匹配前一个字符零次或更多次 + 匹配前一个字符一次或更多次 ? 匹配前一个字符零次或一次 ^ 匹配字符串的开始 $ 匹配字符串的结尾 | 匹配|左右表达式中的任意一个 () 匹配括号内的表达式,也表示一个组 [...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符 {n} 匹配前一个字符n次 {n,} 匹配前一个字符n次或更多次 {n,m} 匹配前一个字符n到m次 # 几个常用的非贪婪匹配Pattern *? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复 .*?x 就是取前面任意长度的字符,直到一个x出现 re.compile(pattern,flags=0) pattern: 编译时用的表达式字符串。 flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。 e.S(DOTALL) 使.匹配包括换行在内的所有字符 re.I(IGNORECASE) 使匹配对大小写不敏感 re.L(LOCALE) 做本地化识别(locale-aware)匹配,法语等 re.M(MULTILINE) 多行匹配,影响^和$ re.X(VERBOSE) 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 re.U 根据Unicode字符集解析字符,这个标志影响w,W,,B re.match(pattern, string, flags).group() 尝试从字符串的开始匹配一个模式如果字符串开始不符合正则表达式,则匹配失败,函数返回None; # 第一个参数是正则表达式,如果匹配成功,则返回一个Match,否则返回一个None; # 第二个参数表示要匹配的字符串; # 第三个参数是标致位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 a=re.search(pattern, string, flags).group() 匹配整个字符串,只到找到第一个匹配然后返回,如果字符串没有匹配,则返回None。 re.sub(pattern, repl, string, count=0, flags=0) 用于替换字符串中的匹配项。 # 第四个参数指替换个数。默认为0,表示每个匹配项都替换。 re.split(pattern, string, maxsplit=0, flags=0) 将字符串按空格分割成一个单词列表。 # re.split(',','123,456') # ['123', '456'] split的优先级查询 # 没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项 # r = re.split('(,)','123,456') # ['123', ',', '456'] re.findall(pattern, string, flags=0) 匹配字符串所有的内容,把匹配到的字符串以列表的形式返回 findall的优先级查询: ?: 在有分组的情况下findall()函数,只拿分组里的字符串,拿所有匹配到的字符串, 如果想要匹配结果,取消权限即可:(?:[0-9]) re.finditer(pattern, string, flags=0) 返回一个存放匹配结果的迭代器 命名分组匹配: 分组的意义,就是在匹配成功的字符串中,再提取()里面的字符串 ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") # 还可以在分组中利用?<name>的形式给分组起名字 # 如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致 # 获取的匹配结果可以直接用group('名字')或group(序号)拿到对应的值