下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

掌握Python的正则表达式,保你必掌握正则!

作者:课课家教育     来源: http://www.kokojia.com点击数:947发布时间: 2019-05-24 14:45:14

标签: 编程语言Python视频Python教程视频

大神带你学编程,欢迎选课

Python正则表达式的巧妙使用 !包你必掌握正则!

Python的作者有意的设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。

 前言

正则表达式就是从字符串中发现规律,并通过“抽象”的符号表达出来。打个比方,对于2,5,10,17,26,37这样的数字序列,如何计算第7个值,肯定要先找该序列的规律,然后用n2+1这个表达式来描述其规律,进而得到第7个值为50。对于需要匹配的字符串来说,同样把发现规律作为第一步,本文主要使用正则表达式完成字符串的查询匹配、替换匹配和分割匹配。

掌握Python的正则表达式,保你必掌握正则!_编程语言_Python视频_Python教程视频_课课家

常用的正则符号

在进入字符串的匹配之前,先来了解一下都有哪些常用的正则符号,见下表所示:

 

如果读者能够比较熟练地掌握上表中的内容,相信在字符串处理过程中将会游刃有余。如前文所说,本节将基于正则表达式完成字符串的查询、替换和分割操作,这些操作都需要导入re模块,并使用如下介绍的几个函数。

字符串的匹配查询

re模块中的findall函数可以对指定的字符串进行遍历匹配,获取字符串中所有匹配的子串,并返回一个列表结果。该函数的参数含义如下:

findall(pattern, string, flags=0)

pattern:指定需要匹配的正则表达式。

string:指定待处理的字符串。

flags:指定匹配模式,常用的值可以是re.I、re.M、re.S和re.X。re.I的模式是让正则表达式对大小写不敏感;re.M的模式是让正则表达式可以多行匹配;re.S的模式指明正则符号.可以匹配任意字符,包括换行符 ;re.X模式允许正则表达式可以写得更加详细,如多行表示、忽略空白字符、加入注释等。

字符串的匹配替换

re模块中的sub函数的功能是替换,类似于字符串的replace方法,该函数根据正则表达式把满足匹配的内容替换为repl。该函数的参数含义如下:

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

pattern:同findall函数中的pattern。

repl:指定替换成的新值。

string:同findall函数中的string。

count:用于指定最多替换的次数,默认为全部替换。

flags:同findall函数中的flags。

字符串的匹配分割

re模块中的split函数是将字符串按照指定的正则表达式分隔开,类似于字符串的split方法。该函数的具体参数含义如下:

split(pattern, string, maxsplit=0, flags=0)

pattern:同findall函数中的pattern。

maxsplit:用于指定最大分割次数,默认为全部分割。

string:同findall函数中的string。

flags:同findall函数中的flags。

实战案例

如果上面的函数和参数含义都已经掌握了,还需要进一步通过案例加强理解,接下来举例说明上面的三个函数:

  1. # 导入用于正则表达式的re模块 
  2. import re 
  3. # 取出字符串string8中所有的天气状态 
  4. string8 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'轻度污染'},{ymd:'2018-01-02',tianqi:'阴~小雨',aqiInfo:'优'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'优'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'优'}" 
  5. # 基于正则表达式使用findall函数 
  6. print(re.findall("tianqi:'(.*?)'", string8)) 
  7. # 取出string9中所有含O字母的单词 
  8. string9 = 'Together, we discovered that a free market only thrives when there are rules to ensure competition and fair play, Our celebration of initiative and enterprise' 
  9. # 基于正则表达式使用findall函数 
  10. print(re.findall('w*ow*',string9, flags = re.I)) 
  11. # 将string10中的标点符号、数字和字母删除 
  12. string10 = '据悉,这次发运的4台蒸汽冷凝罐属于国际热核聚变实验堆(ITER)项目的核二级压力设备,先后完成了压力试验、真空试验、氦气检漏试验、千斤顶试验、吊耳载荷试验、叠装试验等验收试验。' 
  13. # 基于正则表达式使用sub函数 
  14. print(re.sub('[,。、a-zA-Z0-9()]','',string10)) 
  15. # 将string11中的每个子部分内容分割开 
  16. string11 = '2室2厅 | 101.62平 | 低区/7层 | 朝南  
  17.  上海未来 - 浦东 - 金杨 - 2005年建' 
  18. # 基于正则表达式使用split函数 
  19. split = re.split('[-| 
  20. ]', string11) 
  21. print(split) 
  22. # 分割结果的清洗 
  23. split_strip = [i.strip() for i in split] 
  24. print(split_strip) 
  25. out
  26. ['晴''阴~小雨''小雨~中雨''中雨~小雨'
  27. ['Together''discovered''only''to''competition''Our''celebration''of'
  28. 据悉这次发运的台蒸汽冷凝罐属于国际热核聚变实验堆项目的核二级压力设备先后完成了压力试验真空试验氦气检漏试验千斤顶试验吊耳载荷试验叠装试验等验收试验 
  29. ['2室2厅 '' 101.62平 '' 低区/7层 '' 朝南 '' 上海未来 '' 浦东 '' 金杨 '' 2005年建'
  30. ['2室2厅''101.62平''低区/7层''朝南''上海未来''浦东''金杨''2005年建'

如上结果所示,在第一个例子中通过正则表达式"tianqi:'(.*?)'"实现目标数据的获取,如果不使用括号的话,就会产生类似"tianqi:'晴'", "tianqi:'阴~小雨'"这样的值,所以,加上括号就是为了分组,且仅返回组中的内容;

第二个例子并没有将正则表达式写入圆括号,如果写上圆括号也是返回一样的结果,所以findall就是用来返回满足匹配条件的列表值,如果有括号,就仅返回括号内的匹配值;

第三个例子使用替换的方法,将所有的标点符号换为空字符,进而实现删除的效果;

第四个例子是对字符串的分割,如果直接按照正则 '[,。、a-zA-Z0-9()]' 分割的话,返回的结果中包含空字符,如 '2室2厅' 后面就有一个空字符。为了删除列表中每个元素的首尾空字符,使用了列表表达式,并且结合字符串的strip方法完成空字符的压缩。

一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定的(而C语言是用一对花括号{}来明确的定出模块的边界的,与字符的位置毫无关系)。这一点曾经引起过争议。因为自从C这类的语言诞生后,语言的语法含义与字符的排列方式分离开来,曾经被认为是一种程序语言的进步。不过不可否认的是,通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。

赞(15)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程