python正则表达式详解笔记,python正则表达式教学.doc

上传人:封****n 文档编号:96697946 上传时间:2024-03-10 格式:DOC 页数:15 大小:194.88KB
返回 下载 相关 举报
python正则表达式详解笔记,python正则表达式教学.doc_第1页
第1页 / 共15页
python正则表达式详解笔记,python正则表达式教学.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《python正则表达式详解笔记,python正则表达式教学.doc》由会员分享,可在线阅读,更多相关《python正则表达式详解笔记,python正则表达式教学.doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、正则表达式正则表达式是一个特殊的字符序列,计算机科学的一个概念。通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用re模块。re 模块使 Python 语言拥有全部的正则表达式功能。特点:1.灵活性、逻辑性和功能性非常强;2.3.可以迅速地用极简单的方式达到字符串的复杂控制。4.5.对于刚接触的人来说,比较晦涩难懂。6.Python中的正则表达式与大多数编程语言相同,正则表达式里也使用作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符,那么使用编程语言表示的正则

2、表达式里将需要4个反斜杠:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。print(re.match(, hello) # 需要使用四个反斜杠来匹配一个 Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。在Python 字符串前面添加r即可将字符串转换成为原生字符串。print(re.match(r, hello) # 使用两个反斜杠即可匹配一个 查找方法的使用在Python中的查找匹配方法,常见的有下面四种,他们的用法大致相同,但是匹配出的结果却不同。 match方法

3、(只匹配字符串开头) search方法(扫描整个字符串,找到第一个匹配) findall方法(扫描整个字符串,找到所有的匹配) finditer方法(扫描整个字符串,找到所有的匹配,并返回一个可迭代对象)match方法的使用re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。函数语法:re.match(pattern,string,flags=0)参数描述pattern匹配的正则表达式string要匹配的字符串。flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。我们可以使用group(num)函数来获取

4、匹配表达式。import reresult1 = re.match(rH,Hello)result2 = re.match(re,Hello)print(result1.group(0) # H 匹配到的元素print(result1.span() # (0,1) 匹配到的元素所在位置print(result2) # Nonesearch方法的使用re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:re.search(pattern, string, flags=0)示例:import reresult1 = re.search(rHe,Hello)result2 = re.s

5、earch(rlo,Hello)print(result1.group(0) # Heprint(result1.span() # (0,2)print(result2.group(0) # loprint(result2.span() # (3,5)re.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。示例:result1 = re.search(r天气,今天天气不错哟)result2 = re.match(r天气,今天天气不错哟)print(resul

6、t1) # print(result2) # Nonefindall 方法的使用在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意:match 和 search 是匹配一次 findall 匹配所有。语法格式:re.findall(pattern,string,flags=0)示例代码:ret = re.findall(rd+,he23ll34)print(ret) # 23, 34ret = re.match(rd+,he23ll34) print(ret) # None match只匹配开头,所以匹配到ret = re.search(rd+,h

7、e23ll34)print(ret) # search 只能匹配到一个数字注意事项:findall方法匹配时,如果匹配规则里有分组,则只匹配分组数据。ret = re.findall(rw+(qq|126|163).com,123;aa;bb)print(ret) # qq, 163, 126 只匹配到了分组里的内容如果正则表达式里存在多个分组,则会把多个分组匹配成元组。ret = re.findall(rw+(qq|126|163)(.com),123;aa;bb)print(ret) #(qq, .com), (163, .com), (126, .com)如果想要让findall匹配所有

8、的内容,而不仅仅只是匹配正则表达式里的分组,可以使用?:来将分组标记为非捕获分组。ret = re.findall(rw+(?:qq|126|163).com,123;aa;bb)print(ret) # 123, aa, bbfinditer方法的使用和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。ret = re.finditer(rd+,he23ll34) # 得到的结果是一个可迭代对象for x in ret: # 遍历 ret 取出里面的每一项匹配 print(x.group(), x.span() # 匹配对象里的group保存了匹配

9、的结果re.Match类介绍当我们调用re.match方法、re.search方法,或者对re.finditer方法的结果进行迭代时,拿到的数据类型都是re.Match对象。x = re.match(rh,hello)y = re.search(re,hello)z = re.finditer(rl,hello)print(type(x) # print(type(y) # for a in z: print(type(a) # 这个类里定义了相关的属性,可以直接让我们来使用。属性和方法说 明pos搜索的开始位置endpos搜索的结束位置string搜索的字符串re当前使用的正则表达式的对象l

10、astindex最后匹配的组索引lastgroup最后匹配的组名group(index=0)某个分组的匹配结果。如果index等于0,便是匹配整个正则表达式groups()所有分组的匹配结果,每个分组的结果组成一个列表返回groupdict()返回组名作为key,每个分组的匹配结果座位value的字典start(group)获取组的开始位置end(group)获取组的结束位置span(group)获取组的开始和结束位置expand(template)使用组的匹配结果来替换模板template中的内容,并把替换后的字符串返回ret = re.search(r(abc)+, xxxabcabcab

11、cdef)print(ret.pos) # 搜索开始的位置,默认是0print(ret.endpos) # 搜索结束的位置,默认是字符串的长度print(ret.group(0) # abcabcabc 匹配整个表达式print(ret.group(1) # abc 第一次匹配到的结果print(ret.span() # (3, 12) 开始和结束位置print(ret.groups() # 表示当正则表达式里有多个分组时,多个分组的匹配结果pile方法的使用我们在使用正则表达式时,可以直接调用re模块的match,search,findall等方法,传入指定的正则表达式。同时,也可以调用pi

12、le方法,生成一个正则表达式对象,再调用这个正则表达式对象的相关方法实现匹配。示例:re.match(rh,hello) # 可以使用re.match方法直接匹配# 也可以调用re模块的compile方法,生成一个 Pattern 对象,再调用 Pattern 对象的 match方法regex = pile(rh)regex.match(hello)re.search(rl,hello)regex = pile(rl)regex.match(hello)regex = pile(rl)regex.findall(hello)regex = plie(rl)regex.finditer(hell

13、o)正则表达式修饰符修饰符描述re.I使匹配对大小写不敏感re.M多行匹配,影响 和 $re.S使 . 匹配包括换行在内的所有字符示例:print(re.search(rL,hello) # Noneprint(re.search(rL, hello, re.I) # 不区分大小写# w+$ 表示匹配以一个或者多个字母结尾# re.M 可以进行多行匹配,每个换行都认为是一个结尾print(re.findall(rw+$,i am boyn you are girln he is man,re.M) # boy, girl, man# 不实用re.M修饰符,只会匹配到最后的 manprint(r

14、e.findall(rw+$,i am boyn you are girln he is man) # manprint(re.search(r.,n) # None . 匹配除了 n 以外的所有字符print(re.search(r.,n,re.S) # n 匹配到了 n正则表达式模式模式字符串使用特殊的语法来表示一个正则表达式:1.字母和数字表示他们自身,一个正则表达式模式中的字母和数字匹配同样的字符串。2.re.search(rH,Hello) # 这里的 H 表示的就是字母 H 自身,代表有特殊含义3.4.多数字母和数字前加一个反斜杠时会拥有不同的含义。5.ret = re.searc

15、h(rd,he12ms90) # 这里的 d 表示的是匹配数字6.7.标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。8.ret = re.search(r.,hello) # 这里的 . 表示的是匹配任意字符ret = re.search(r.,he.llo) # 这里的 . 进行了转义,才表示标点符号自身。9.10.反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如rt,等价于t)匹配相应的特殊字符。11.下表列出了正则表达式模式语法中的特殊元素,如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。非打印字

16、符非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:字符描述cx匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 c 字符。f匹配一个换页符。等价于 x0c 和 cL。n匹配一个换行符。等价于 x0a 和 cJ。r匹配一个回车符。等价于 x0d 和 cM。s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 fnrtv。注意 Unicode 正则表达式会匹配全角空格符。S匹配任何非空白字符。等价于 fnrtv。t匹配一个制表符。等价于 x09 和 cI。v匹配一个垂

17、直制表符。等价于 x0b 和 cK。特殊字符所谓特殊字符,就是一些有特殊含义的字符。若要匹配这些特殊字符,必须首先使字符转义,即,将反斜杠字符放在它们前面。下表列出了正则表达式中的特殊字符:特殊字符描述( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用( 和)。.匹配除换行符n 之外的任何单字符。要匹配 . ,请使用. 。标记一个中括号表达式的开始。要匹配 ,请使用。将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, n 匹配字符 n。n 匹配换行符,匹配,而(则匹配 ( 。标记限定符表达式的开始。要匹配 ,请使用。|指明两项之

18、间的一个选择。要匹配 |,请使用 |。d匹配一个数字字符。等价于 0-9。0-9匹配任何数字。等价于dD匹配一个非数字字符。等价于0-9。a-z匹配任何小写字母A-Z匹配任何大写字母a-zA-Z0-9匹配任何字母及数字。等价于ww匹配包括下划线的任何单词字符。等价于A-Za-z0-9_。W匹配任何非单词字符。等价于A-Za-z0-9_。u4e00-u9fa5匹配纯中文定位符定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。定位符用来描述字符串或单词的边界,和$分别指字符串的开始与结束,b描述单词的

19、前或后边界,B表示非单词边界。正则表达式的定位符有:特殊字符描述匹配输入字符串的开始位置,例如:h匹配以h开头;在方括号表达式中时,它表示不接受该字符集合,例如0-9匹配除了数字以外的数据。要匹配 字符本身,请使用 。$匹配输入字符串的结尾位置。要匹配$字符本身,请使用$。b匹配一个单词边界,即字与空格间的位置。B非单词边界匹配。限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或n或n,或n,m共6种。正则表达式的限定符有:字符描述*匹配前面的子表达式零次或多次。例如,zo能匹配 z 以及 zoo。等价于0,。+匹配前面的子表达式一次或多次。例如,zo+

20、能匹配 zo 以及 zoo,但不能匹配 z。+ 等价于 1,。?匹配前面的子表达式零次或一次。例如,do(es)? 可以匹配 do 、 does 中的 does 、 doxy 中的 do 。? 等价于 0,1。nn 是一个非负整数。匹配确定的 n 次。例如,o2 不能匹配 Bob 中的 o,但是能匹配 food 中的两个 o。n,n 是一个非负整数。至少匹配n 次。例如,o2, 不能匹配 Bob 中的 o,但能匹配 foooood 中的所有 o。o1, 等价于 o+。o0, 则等价于 o*。n,mm 和 n 均为非负整数,其中n = m。最少匹配 n 次且最多匹配 m 次。例如,o1,3 将匹

21、配 fooooood 中的前三个 o。o0,1 等价于 o?。请注意在逗号和两个数之间不能有空格。示例:re.search(rs,大家好 我是 代码) # 匹配所有的空字符re.search(rS,大家) # 匹配所有的非空字符re.search(rn,大家好n我是代码) # 匹配换行re.search(rn$,hello python) # 匹配以 n 结尾re.search(rh.+n$,hello python) # 匹配以 h 开头,中间出现一次或多次任意字符,并且以n结尾re.search(rha*,h) # 匹配以 h 开头,a出现0次或者一次正则替换Python中的re模块提供了

22、re.sub用户替换字符串中的匹配项。语法:re.sub(pattern,repl,string,count=0)参数: pattern : 正则中的模式字符串。 repl : 替换的字符串,也可为一个函数。 string : 要被查找替换的原始字符串。 count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。phone = 2004-959-559 # 这是一个电话号码# 删除注释num = re.sub(r#.*$, , phone)print (电话号码 : , num)# 移除非数字的内容num = re.sub(rD, , phone)print (电话号码 : ,

23、num)repl可以使用一个字符串用来表示替换后的结果以外,还可以传入一个函数。def double(matched): test = int(matched.group(test) return str(test * 2)print(re.sub(r(?Pd+), double, hello23hi贪婪和非贪婪模式Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在*,?,+,m,n后面加上?使贪婪变成非贪婪。 s=This is a number 234-235-22-423 r=re.match(.+

24、(d+-d+-d+-d+),s) r.group(1)4-235-22-423 r=re.match(.+?(d+-d+-d+-d+),s) r.group(1)234-235-22-423正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,在我们上面的例子里面,“.+”会从字符串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。 re.match(raa(d+),aa2343ddd).group(1)2343 re.match(raa(d+?),aa2343ddd).group(1)2 re.match(raa(d+)ddd,aa2343ddd).group(1) 2343 re.match(raa(d+?)ddd,aa2343ddd).group(1)2343

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 初中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com