python--re模块(正则表达式)

正则在线测试  http://tool.chinaz.com/regex  

\   转义字符

[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()匹配对象函数来获取匹配表达式,如果返回的是Nonegroup()时会报错

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 表示替换所有的匹配

返回一个元组  元组的第一项就是替换后的字符串   第二项是被替换的次数

天子骄龙

猜你喜欢

转载自www.cnblogs.com/liming19680104/p/11323115.html
今日推荐