模式介绍

基本用法

  1. ^: 匹配字符串的开头,如:^很
  2. $: 匹配字符串的末尾,如:蓝$
  3. .: 匹配除了换行符外的任意字符,指定re.S(re.DOTALL)时,可包括换行符
  4. []: 匹配[]中任意一个字符,如:\[Pp\],\[0-9\]
  5. [^...]: 匹配不在[]中的字符,如:[^abc] ,可匹配除了a,b,c之外的字符
  6. : 匹配其前面的字符出现0次或多次,如:hel*,可匹配 helll,he
  7. +: 匹配其前面的字符出现1次或多次,如:hel+,可匹配 helll,hel,但无法匹配he
  8. ?: 匹配其前面的字符出现0次或1次,如:hel?, 可匹配hel,he,但无法匹配hell
  9. {n}: 匹配其前面的表达式出现n次,如:o{2} ,可匹配food,但无法匹配pow
  10. {n,}: 匹配其前面的表达式出现n次以上,如:o{2,} ,可匹配food,fooooood,无法匹配pow,o{1,},等价于o+o{0,},o*
  11. {n,m}: 匹配其前面的表达式最少出现n次最多出现m次,如:o{2,5} ,可匹配food,foooood,无法匹配pow,fooooood,o{0,1},等价于o?
  12. a|b: 匹配a或b,如:p[a|b]ck,可匹配pack,pbck

分组

  1. (): 对正则表达式分组,并返回括号中的内容
  2. (?imx): 正则表达式包含三种可选标志:i, m, 或 x ,只影响括号内的区域
  3. (?-imx): 正则表达式关闭 i, m, 或 x 可选标志,只影响括号内的区域
  4. (?: re): 类似 (), 但不表示一个组
  5. (?imx: re): 在括号中使用i, m, 或 x 可选标志
  6. (?-imx: re): 在括号中不使用i, m, 或 x 可选标志
  7. (?#...): 注释
  8. (?=re): 前向肯定界定符 re.findall(r'\d+(?=abc)',"1abc") ,只抽取数字,且该数字后面跟的字符是abc
  9. (?!re): 前向否定界定符。re.findall(r'\d+(?!abc)',"1abf") ,只抽取数字,且该数字后面跟的字符不是abc
  10. (?<!re): 后向否定界定符
  11. (?>ew): 后向肯定界定符

特殊符号

  1. \w: 匹配字母数字及下划线,等价于 [A-Za-z0-9_]
  2. \W: 匹配非字母数字及下划线,等价于 [^A-Za-z0-9_]
  3. \s: 匹配任意空白字符,等价于 [ \f\n\r\t\v]
  4. \S: 匹配任意非空字符,等价于 [^ \f\n\r\t\v]
  5. \d: 匹配任意数字,等价于 [0-9]
  6. \D: 匹配任意非数字,等价于 [^0-9]
  7. \A: 匹配字符串开始
  8. \z: 匹配字符串结束
  9. \Z: 匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串
  10. \G: 匹配最后匹配完成的位置
  11. \b: 匹配单词边界,即单词和空格间的位置 ,如:er\b,可匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'
  12. \B: 匹配非单词边界,如:er\B,可匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'
  13. \n, \t, 等: 匹配换行符,制表符等
  14. \1...\9: 匹配第n个分组的内容
  15. [\u4e00-\u9fa5]: 可以匹配任意UTF-8编码下的中文字符

修饰符

  1. re.I 忽略大小写
  2. re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
  3. re.M 多行模式,影响 ^ 和 $
  4. re.S 匹配包括换行在内的所有字符
  5. re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
  6. re.X 为了增加可读性,忽略空格和 # 后面的注释

匹配对象方法

  1. group(num=0): 输入可为多个组号,获取包含组所对应值的元组
  2. groups(): 获取包含所有小组字符串的元组
  3. group([group1, …]):获取一个或多个分组匹配字符串
  4. start([group]):获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0
  5. end([group]):获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0
  6. span([group]):获取 (start(group), end(group))

函数

从起始位置查找

re.match(pattern, string, flags=0):从字符串的起始位置匹配模式,可以使用group(num) 或 groups() 获取匹配表达式
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,表示匹配模式,具体参数如下:

re.match('www', 'www.baidu.com').span() 
#返回:(0,3)
re.match('com', 'www.baidu.com') 
#返回:None

查找匹配字符串

re.search(pattern, string, flags=0):扫描整个字符串并返回第一个成功的匹配,可以使用group(num) 或 groups() 获取匹配表达式

re.search('www', 'www.baidu.com').span() 
#返回:(0,3)
re.search('com', 'www.baidu.com').span() 
#返回:(11,14)

替换字符串

re.sub(pattern, repl, string, count=0, flags=0):替换字符串中的匹配项
repl:替换的字符串,也可为一个函数
count:模式匹配后替换的最大次数,默认0表示替换所有的匹配

re.sub(r'#.*$', "", "2004-959-559 # 这是电话号码") 
#返回:2004-959-559
re.sub(r'\D', "", "2004-959-559 # 这是电话号码") 
#返回:2004959559

编译正则表达式

re.compile(pattern[, flags]):用于编译正则表达式,生成正则表达式对象,使运行速度更快,可供 match() 和 search() 这两个函数使用

查询子串(返回列表)

re.findall(pattern, string[, pos[, endpos]]):在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果无匹配项,则返回空列表
pos:指定字符串的起始位置,默认为 0
endpos:指定字符串的结束位置,默认为字符串的长度

result1 = re.findall(r'\d+', 'baidu 123 google 456') 
#返回:\['123', '456']
result2 = re.findall(r'\d+', 'bai88du123google456', 0, 10)
#返回:\['88', '12']

查询子串(返回迭代器)

re.finditer(pattern, string, flags=0):在字符串中找到正则表达式匹配的所有子串,并把它们作为一个迭代器返回

it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it:
    print(match.group()) 
#返回:12,32,43,3

切分字符串

re.split(pattern, string[, maxsplit=0, flags=0]):按照能够匹配的子串将字符串分割后返回列表
maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数

re.split('\W+', 'baidu, baidu, baidu.') 
#返回:\['baidu', 'baidu', 'baidu', '']
re.split('(\W+)', ' baidu, baidu, baidu.') 
#返回:\['', ' ', 'baidu', ', ', 'baidu', ', ', 'baidu', '.', '']
re.split('\W+', ' baidu, baidu, baidu.', 1) 
#返回:\['', 'baidu, baidu, baidu.']
re.split('a*', 'hello world') 
#返回:\['hello world']

 (参考: 玉冰整理总结)

posted on 2021-11-27 16:07  xieyan0811  阅读(52)  评论(0编辑  收藏  举报