python 中通过正则表达式对字符串进行匹配的时候,需要用到re模块
import re
- 标准写法:r要写,代表对整个字符串进行转义
- re.功能(r”正则表达式”,”需要匹配的字符串”或字符串的引用,标志位(可以不写))
- re.功能(pattern, string, flags) # flags代表标志位,用于控制pattern是否区分大小写,多行匹配等。
r 表示对正则表达式进行转义(避免正则表达式中\使用时混淆)
^ 仅匹配整个字符串开头
$ 仅匹配整个字符串末尾
\b 匹配一个单词结束边界,例如”er\b”匹配”never”中的er
\B 匹配非单词结束边界,例如”er\B”匹配”verb”中的er
[^X] 匹配非X,^相当于取反,正则默认贪婪,非贪婪加?
匹配分组:
| 匹配左右任意一个表达式
(ab) 将括号内的ab作为一个整体
\num 引用第num个分组
(?P<name>) 分组起名
(?p=name) 引用别名name的分组
通配符
. 除”\n”,任意一个字符
[] 中括号内任意一个字符
\d 数字
\D 非数字
\s 空白字符,包括空格,Tab键
\S 非空白字符
\w 字母、数字、_
\W 非字母、数字、_
匹配前一个字符多少次:
* 匹配>=0次
+ 匹配>=1次
? 匹配0或1次
{m} 匹配m次
{m,n} 匹配m到n次
标志位:
re.I 使匹配对大小写不敏感
re.S 使.可以匹配\n
re.M 多行匹配,影响^和$
多个标志位可以写re.S|re.I
RegexObjdct实例的方法和属性
group() 返回匹配的字符串
start() 返回匹配开始的下标
end() 返回匹配结束的下标
span() 返回一个元祖,是匹配(开始,结束)的下标
1 match 完全匹配
默认从字符串开头开始匹配
re.match(r”正则表达式”, “字符串”) # 如果匹配成功,返回的是一个对象;匹配不成功,返回None
re.match(r”正则表达式”, “字符串”).group() # 调用group()方法,返回匹配到的内容
2 search 搜索第一个
对整个字符串进行匹配,找到第一个匹配到的内容,将这部分作为对象返回
re.search(r”正则表达式”, “字符串”) # 返回一个对象
re.search(r”正则表达式”, “字符串”).group() # 调用group()方法,返回匹配到的内容
re.search(r”正则表达式”, “字符串”).start() # 返回匹配到内容的起始位置下标
3 findall 查找所有
对整个字符串进行匹配,找到所有匹配到的内容,将这些内容以列表方式返回
re.findall(r”正则表达式”, “字符串”) # 返回一个列表
4 sub 替换
对整个字符串进行匹配,找到所有匹配到的内容,将其替换,并返回替换后的字符串
re.sub(r”正则表达式”, “替换内容”, “字符串”,)
替换内容可以是一个函数,函数的返回值即是字符串中要替换的元素;这个函数必须将正则匹配后的对象作为参数传入,
若要在匹配到的内容上进行修改,则需要调用group()方法获取匹配内容,如果直接修改,则不需要。
5 split 切片
对整个字符串进行匹配,找到所有匹配到的内容,在匹配到的内容左右进行切片,返回一个列表。
re.split(r”正则表达式”, “字符串”) # 返回一个列表
6 compile 封装
将正则表达式进行封装,可以循环使用,减少工作量
option = re.compile(r”正则表达式”)
调用方法:例如:option.match(“字符串”)
In [66]: option = re.compile(r"\d")
In [67]: option.findall("a1b2c3")
Out[67]: ['1', '2', '3']
7 finditer
是findall的惰性版本,返回的不是列表,是一个生成器,按需生成re.MatchObject实例,如果有很多匹配的话,re.finditer函数能节省大量内存。
In [61]: a = "aaa1aa2aa3aa4aa5aa6"
In [62]: b = re.finditer("\d",a)
In [63]: next(b)
Out[63]: <_sre.SRE_Match object; span=(3, 4), match='1'>
In [64]: next(b).group()
Out[64]: '2'