基础表达式

表达式含义
abc匹配文本中的abc 固定内容
[abc]匹配a或b或c
q[abc]匹配qa或qb或qc
[^abc]匹配除了a、b、c之外的其他字符
[a-z]匹配a到z的任意一个字符
[0-9]匹配0-9的任意一个字符
.匹配除换行符以外的任意一个字符
.+匹配除换行符以外的任意一个或多个字符(贪婪匹配,尽量匹配长的)
.+?匹配除换行符以外的任意一个或多个字符(非贪婪匹配,匹配短的)
\w代指字母或数字或下划线(汉字)
\d匹配一个数字
\d+匹配一个或多个数字
\s匹配任意一个空白符,包括空格、制表符等

与数量相关

表达式含义
*重复0次或多次
2*b2出现0次或多次,例如:b2b22b
+重复1次或多次
?重复0次或1次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次,包括n,m

括号(分组)

提取数据区域:

表达式含义
151(2\d{5})匹配成功之后只会提取括号中的值。
151(2\d{5}|r\w+)括号中使用了管道符表示或的关系。
151(2\d)*括号中的内容出现0次或多次。
  • 单个括号

    1
    2
    3
    4
    5
    import re
    string ="我才不是有钱人,151288876"
    pattern = "151(2\d{5})"
    result = re.findall(pattern,string)
    print(result) # ['288876']
  • 多个括号并列

    1
    2
    3
    4
    5
    import re
    string ="我才不是有钱人,151288876"
    pattern = "1(5)1(2\d{5})"
    result = re.findall(pattern,string)
    print(result) # [('5', '288876')]
  • 括号嵌套

    1
    2
    3
    4
    5
    import re
    string ="我才不是有钱人,151288876"
    pattern = "(151(2\d{5}))"
    result = re.findall(pattern,string)
    print(result) # [('151288876', '288876')]
  • 获取指定区域+“或”条件:

    1
    2
    3
    4
    5
    import re
    string = "我才不是有钱人,151288876,151aroot,151ajvxovidjsft"
    pattern = "151(2\d{5}|a\w+t)"
    result = re.findall(pattern, string)
    print(result) # ['288876', 'aroot', 'ajvxovidjsft']

起始和结束

一般用于数据校验。

  • ^开始

  • $结束

    1
    2
    3
    4
    5
    import re
    string = "151288876,151aroot,151ajvxovidjsft"
    pattern = "^151(2\d{5}|a\w+t)$"
    result = re.findall(pattern, string)
    print(result) # []
    1
    2
    3
    4
    5
    import re
    string = "151ajvxovidjsft"
    pattern = "^151(2\d{5}|a\w+t)$"
    result = re.findall(pattern, string)
    print(result) # ['ajvxovidjsft']

特殊字符

正则表达式中* . \ {} ()等具有特殊的含义,如果要在正则中匹配他们,需要进行转义。

  • \转义字符

python中的re模块

  • findall, 获取匹配到的所有数据

  • match,从起始位置开始匹配符合规则的表达式,未匹配成功返回None。一开始就不符合就是None。匹配成功返回一个特殊的对象,通过.group()方法可以获取到。

  • search, 浏览整个文本去匹配第一个,未匹配成功返回None,成功返回特殊对象,同上。

  • sub,替换匹配成功的位置。sub(pattern,"修改的内容",text,num) num是一个数字,可以不填写,如果填写了,表示替换前num个。

  • split,根据匹配成功后的位置进行分割。同样可以添加数字限定前几个。

  • finditer,返回一个迭代器。可以遍历的过程中逐渐拿到数据。

    分组命名空间的使用:?P<xxx>正则