python--re模块(正则表达式)
正则在线测试 http://tool.chinaz.com/regex
需要 import re
\ 转义字符
[abc] 匹配中括号中的一个字符
[a-c] 匹配a-c中的一个字符
[a-dm-p] 匹配a-d或m-p中的一个字符
. 除换行符\n 之外的任何单个字符匹配
\w 匹配一个单词字符 字母(包括a-z A-Z)、数字、下划线
\W 匹配 除\w之外的其它字符
\s 匹配 任何空白字符,(包括 换行符\n、回车符\r、制表符\t、垂直制表符\v、换页符\f)
\S 匹配 除\s之外的其它字符
\d 匹配数字(0--9)
\D 匹配 除\d之外的其它字符
\n 匹配换行符\n
\t 匹配制表符
\b 匹配单词结尾 ab\b 以ab为结尾的单词【边界分隔符可以是 空格、逗号、-、句号】
\B 匹配非单词边界 比如 ab\B 不是以ab结尾的单词
^ 匹配字符串开头 ^gh gh是字符串的头
[^x] 匹配除了x之外的任意字符, 非的意思
[^abc] 匹配除了abc三个字母之外的任意字符
$ 匹配字符串的尾 gh$ gh是字符串的尾
ae|b 匹配ae或b 【先左后右 ab|abc 匹配ab不匹配abc】
() 分组
按照左括号从左往右排序第一组 \1 以此类推 表示与第一组内容相同,后面的分组的内容跟这个相同时\1, 需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式
(?P<name>……) 除了原有的编号外,再指定一个名称,后面的分组的内容跟这个相同时(?P=name)
例子
在findall split 有分组优先
{n} 重复n次
{n,} 重复n次或多于n次
{n,m} 重复 n -m次
{n}? 重复n次 尽量少重复
{n,}? 重复n次或多于n次 尽量少重复
{n,m}? 重复n-m次 尽量少重复
* 表示重复0次或多次 【尽量多的匹配 贪婪匹配】
*? 重复0次或多次 尽量少重复
+ 重复1次或多次 【尽量多的匹配 贪婪匹配】
+? 重复1次或多次 尽量少重复
? 重复0次或1次
注意 量尺? 就是惰性匹配
.*?x 遇到x就停
r 后面的字符都是普通字符
?= 正向预查[正向条件匹配] 这个位置满足条件的就匹配,不满足条件就不匹配
例 \d{3}-\d{8} (?=Microsoft) Microsoft不会显示出来
?! 负正向预查 [非正向条件匹配] 这个位置满足条件的就不匹配,不满足条件就匹配
例 \d{3}-\d{8} (?!Microsoft) Microsoft不会显示出来
?<= 反向预查 这个位置满足条件的就匹配,不满足条件就不匹配
例 (?<=girl) \d{3}-\d{3} 条件在前头
| 或 从左往右匹配 左边一旦匹配不在匹配右边,所以把长的放左边
正则方法:
标志位
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式,会影响^ $,每一行都是一个新的开头和结尾
re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 默认设置
re.X 为了增加可读性,忽略空格和' # '后面的注释
compile 函数
用于编译正则表达式,生成一个正则表达式对象
语法格式为:p=re.compile(pattern[, flags])
参数1 pattern : 一个字符串形式的正则表达式
参数2 flags 可选,标志位 表示匹配模式,比如忽略大小写,多行模式等
findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
语法格式一:s=re.findall('\d','liming tan23guwu468zhong')
参数1 正则表达式
参数2 字符串
注意:findall函数的正则表达式中如果有(),默认优先匹配()内;要取消分组优先在组内加?:
例子 s=re.findall('www.(?:baidu|oldboy).com','jhgfwww.oldboy.comhgffd')
可以给分组起名 (?P<名字>\d+)
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
参数1 正则表达式
参数2 字符串
参数3 可选 标志位
返回值 是一个对象迭代器,每个对象需要group()才能拿到结果
例子
s=re.finditer('\d+','adff34lkjhg87nhbvf90')
for i in s:
print(i.group())
语法格式二:s=p.findall('2345lm0987MING654abc87654',5,18)
p 正则对象
参数1 字符串
参数2 起始位置
参数3 结束位置(不包括)
例子 s=p.findall('2345lm0987MING654abc87654',5,18)
re.search方法
扫描整个字符串并返回第一个成功的匹配
函数语法:re.search(pattern, string, flags=0)
参数1 正则表达式
参数2 要匹配的字符串
参数3 可选参数 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
匹配成功re.search方法返回一个匹配的对象,否则返回None
我们可以使用group()匹配对象函数来获取匹配表达式,如果返回的是None,group()时会报错
group() 可以加一个参数(组号),组号就是正则表达式的分组的序号 第一个()序号是1
例子
s=re.search(r'[A-Z]+','2345lm098KH7654abc87654')
if s !=None:
ss=s.group()
print(ss)
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
匹配成功返回一个匹配的对象,我们可以使用group()匹配对象函数来获取匹配表达式
如果返回的是None,group()时会报错
例子
s=re.match(r'[A-Z]+','B2345lm098KH7654abc87654')
if s !=None:
ss=s.group()
print(ss)
re.split 分割
能够匹配的做为分隔符,分割后返回列表
语法 s=re.split(pattern, string[, maxsplit=0, flags=0])
参数1 正则表达式
参数2 字符串
参数3 可选 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数
参数4 可选 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
注意:分组功能
如果有(),会保留()组内分隔符
例子
s=re.split('(\d+)','adjg24kjbvc76lkjh89uytrc94mhb')
结果 ['adjg', '24', 'kjbvc', '76', 'lkjh', '89', 'uytrc', '94', 'mhb']
re.sub用于替换字符串中的匹配项
语法:s=re.sub(pattern, repl, string, count=0)
参数1 正则表达式 满足正则的被替换
参数2 替换的字符串,也可为一个函数
参数3 原字符串
参数4 替换的最大次数,默认 0 表示替换所有的匹配
返回替换后的字符串
s=re.subn('\d','|','liming2lixueqian8李明')
参数1 正则表达式 满足正则的被替换
参数2 替换的字符串,也可为一个函数
参数3 原字符串
参数4 替换的最大次数,默认 0 表示替换所有的匹配
返回一个元组 元组的第一项就是替换后的字符串 第二项是被替换的次数
我的常用匹配
\d+\.?\d* 数值
天子骄龙