好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Python的正则表达式(一)

这是Python的独立模块,需要引入。

import re

1. 先说re函数

re.match(pattern, string, flags=0)

参数:pattern:匹配的正则表达式;string:要匹配的字符串;flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,后面细说。

用法:匹配以xxx 开头 的字符串,匹配成功就返回对象,否则返回None

re.search(pattern, string, flags=0)

参数同上

用法:扫描整个字符串并返回 第一个 成功的 匹配 ,否则返回None

差异:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.sub(pattern, repl, string, count=0, flags=0)

参数:pattern : 正则中的模式字符串;repl : 替换的字符串,也可为一个函数;string : 要被查找替换的原始字符串;count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

用法:用于 替换 字符串中的匹配项。

re测试数据pile(pattern[, flags])

参数说明同上

用法:该函数用于 编译正则表达式 ,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用

findall(string[, pos[, endpos]])

参数:string : 待匹配的字符串;pos : 可选参数,指定字符串的起始位置,默认为 0;endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

用法:在字符串中找到正则表达式所 匹配的所有 子串,并返回一个 列表 ,如果没有找到匹配的,则返回空列表。

差异: match 和 search 是匹配一次 findall 匹配所有。

2. flag说明(修饰符,可选标志)

re.I 忽略大小写,I代表IGNORECASE

re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 取决于当前的本地化设置,L代表LOCALE

re.M 多行模式,使用本标志后,‘^’和‘$’匹配行首和行尾时,会增加换行符之前和之后的位置,M代表MULTILINE

re.S 使 “.” 特殊字符完全匹配任何字符,包括换行;没有这个标志, “.” 匹配除了换行符外的任何字符,S代表DOTALL,即等同于re.DOTALL

re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

re.X 为了增加可读性,忽略空格和 # 后面的注释,X代表VERBOSE,等同于re.VERBOSE

注:多个flag同时使用可以使用OR(|) 它们来指定,比如re.I | re.L

3. 正则匹配模式

3.1表达式举例以及‘r’

\\d-\\d\\d-\\d代表1个数字加'-'再加2个数字再加'-'再加1个数字,比如1-22-3

\\d{2}-\\d{3}-\\d{4}代表2个数字加'-'再加3个数字再加'-'再加4个数字,比如12-222-3456

如上,因为\是需要转义的,因此我们需要在'\'前再加上'\'表示

用'r'可以解决,r表示传入原始字符串,它不包括转义字符

比如\\d-\\d\\d-\\d=r'\d-\d\d-\d'

3.2 字符分类

\d? 0到9的任何数字 ,等价于 [0-9]?(记忆方法:digital数字的)

\D? 除0到9的数字以外的任何字符,等价于 [^0-9]

\w? 任何字母、数字或 下划线 字符(可以认为是匹配“单词”字符),等价于'[A-Za-z0-9_]'(记忆方法: word单词)

\W? 除字母、数字和下划线以外的任何字符 ,等价于 '[^A-Za-z0-9_]'

\s? 空格、制表符或换行符(可以认为是匹配“空白”字符) ,等价于 [ \f\n\r\t\v]?(记忆方法:Space,空格空白)

\S? 除空格、制表符和换行符以外的任何字符 ,等价于 [^ \f\n\r\t\v]

3.2语法

常用:

^匹配字符串的开头

$匹配字符串的末尾。

.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

.*.*的组合可以匹配所有字符

[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'

[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

()用来表达分组,后面有举例

*匹配0次或多次,r'Bat(wo)*man',匹配wo0次或多次

+匹配1次或多次r'Bat(wo)*man',匹配wo至少1次或多次

?可选匹配,r'Bat(wo)?man',匹配wo0次或1次

{}花括号里的数字表示匹配次数,比如(AB){3},将匹配ABABAB,{AB}{2,4}将匹配ABAB,ABABAB,ABABABAB,(AB){,3}匹配0到3次的AB,(AB){5,}匹配5次或更多次的AB

|或关系,A | B 表示 A或B

贪心和非贪心模式

所谓贪心模式就是python的正则表达式尽可能的匹配最长的字符串,python默认是贪心的,如果需要匹配尽可能的最短字符串,在结束的花括号跟着一个问号r'(AB){3,5}'默认会先匹配最长的,r'(AB){3,5}?'默认匹配最短的

举例:

Greedystr='ABABABABAB'
Greedyre=re测试数据pile(r'(AB){3,5}')
Greedyre1=re测试数据pile(r'(AB){3,5}?')
Greedy_result=Greedyre.search(Greedystr)
Greedy_result1=Greedyre1.search(Greedystr)
print('默认贪心模式:',Greedy_result.group())
print('修改为非贪心模式:',Greedy_result1.group())

结果:

默认贪心模式: ABABABABAB

修改为非贪心模式: ABABAB

3.3 ()分组,re的group用法

()可以对表达式进行分组,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式

group(num=0),默认为0,可以输入多个组号

groups()返回一个包含所有小组字符串的元组

举例说明:

1.没有分组的情况

message='My?telephone?number?is?0731-8888-4321,?and?his?is?0733-5678-6666'
phonenum=re测试数据pile(r'\d{4}-\d{4}-\d{4}')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,r代表传入原始字符串
search_result=phonenum.search(message)#search只返回以第一次命中的
findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表
print('search的结果:',search_result.group())
print('findall的结果:',findall_result)

#结果 :

search的结果: 0731-8888-4321

findall的结果: ['0731-8888-4321', '0733-5678-6666']

2.有分组的情况,分组用()表示,返回的是元组

message='My?telephone?number?is?0731-8888-4321,?and?his?is?0733-5678-6666'
phonenum=re测试数据pile(r'(\d{4})-(\d{4})-(\d{4})')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,分组多了括号(),这里分了三个组
search_result=phonenum.search(message)#search只返回以第一次命中的
findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表
print('search的结果group:',search_result.group(),'search的结果指定group1,2:',search_result.group(1,2))
print('findall的结果:',findall_result)

#结果

search的结果group: 0731-8888-4321 search的结果指定group1,2: ('0731', '8888')

findall的结果: [('0731', '8888', '4321'), ('0733', '5678', '6666')]

3.有分组但匹配中有()的情况,‘(’要用转义字符,举例中电话号码加了括号

message='My?telephone?number?is?(0731)-8888-4321,?and?his?is?(0733)-5678-6666'
phonenum=re测试数据pile(r'(\(\d{4}\))-(\d{4})-(\d{4})')#编译正则表达式,\d代表数字,{4}表示匹配的个数为4,分组多了括号(),这里分了三个组
search_result=phonenum.search(message)#search只返回以第一次命中的
findall_result=phonenum.findall(message)#返回所有命中的结果,返回的是列表
print('search的结果group:',search_result.group(),'search的结果指定group1,2:',search_result.group(1,2))
print('findall的结果:',findall_result)

#结果

search的结果group: (0731)-8888-4321 search的结果指定group1,2: ('(0731)', '8888')

findall的结果: [('(0731)', '8888', '4321'), ('(0733)', '5678', '6666')]

查看更多关于Python的正则表达式(一)的详细内容...

  阅读:27次