前言正则表达式是从字符串中寻找规则,并通过“抽象”的符号来表达。例如,对于2、5、10、17、26、37这样的数列,如何计算第7个值首先要找到数列的规律,然后用表达式n2+1来描述规律,然后得到第七个值50。对于需要匹配的字符串,同样把规则的发现作为第一步。本文主要使用正则表达式来完成字符串的查询匹配、替换匹配和拆分匹配。常用的正则符号在进入字符串匹配之前,我们先来了解一下常用的正则符号有哪些,如下表所示:如果读者能够比较熟练的掌握上表的内容,相信在字符串处理的过程中就能游刃有余。如前所述,本节将完成基于正则表达式的字符串查询、替换和切分操作。这些操作需要导入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模块中子函数的作用是替换,即类似于字符串的替换方法。该函数根据正则表达式将匹配的内容替换为repl。该函数参数含义如下:sub(pattern,repl,string,count=0,flags=0)pattern:同findall函数中的pattern。repl:指定要替换的新值。string:同findall函数中的string。count:用于指定最大替换次数,默认为全部替换。flags:与findall函数中的标志相同。字符串的匹配与拆分re模块中的split函数根据指定的正则表达式对字符串进行拆分,类似于字符串的split方法。该函数具体参数含义如下:split(pattern,string,maxsplit=0,flags=0)pattern:同findall函数中的pattern。maxsplit:用于指定最大拆分数,默认为全部拆分。string:同findall函数中的string。flags:与findall函数中的标志相同。实际案例如果你已经掌握了以上函数和参数的含义,还需要通过案例进一步加强理解,然后用例子来说明以上三个函数:#importremoduleforregularexpressionsimportre#takeoutallthestringsinstring8天气状态string8="{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'轻度污染'},{ymd:'2018-01-02',tianqi:'阴~轻rain',aqiInfo:'优秀'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'优秀'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'excellent'}"#使用基于正则表达式的findall函数print(re.findall("tianqi:'(.*?)'",string8))#取出所有的Olettersinstring9Wordstring9='Together,wediscoveredthatafreemarketonlythriveswhenotherearerrulestoensurecompetitionandfairplay,Ourcelebrationofinitiativeandenterprise'#使用基于正则表达式的findall函数print(re.findall('w*ow*',string9,flags=re.I))#Punctuationmarks,numbersandDeletetheletterstring10='据悉,此次发运的4台凝汽罐属于国际热核聚变实验堆(ITER)项目的核二次承压设备,先后完成了压力试验、真空test,heliumleaktest,jackAcceptancetestssuchastest,lugloadtest,stackingtest等'#使用sub函数print(re.sub('[,.,a-zA-Z0-9()]','',string10))#将string11中各子部分的内容隔开string11='2房2厅|101.62平|低区/7层|朝南上海Future-Pudong-Jinyang-2005Jian'#使用基于正则表达式的split函数split=re.split('[-|]',string11)print(split)#分割结果的清洗split_strip=[i.strip()foriiinsplit]print(split_strip)out:['晴天','阴~小雨','小雨~中雨','中雨~小雨']['一起','发现','只','to','competition','Our','celebration','of']据悉,此次发运的凝汽罐属于国际热核聚变实验堆项目核二次承压设备,已先后完成承压测试、真空测试、氦气测试漏电测试千斤顶测试接线片负载测试堆码测试等验收测试晋阳','2005年建成']['2室2厅','101.62平方米','低面积/7层','朝南','上海未来','Pudong','Jinyang','builtin2005']如上结果所示,在第一个例子中,目标数据是通过正则表达式“tianqi:'(.*?)'”得到的。如果不使用括号,会生成类似"tianqi:'qing'","tianqi:'yin~lightrain'",所以加括号是为了分组,只返回组内的内容;第二个例子没有把正则表达式写进圆括号里,写了括号也会返回同样的结果,所以用findall来返回满足匹配条件的列表值。如果有括号,则只返回括号内的匹配值;第三个例子使用替换法,将所有的标点符号替换为空字符,从而达到删除的效果;第四个例子是拆分字符串,如果直接按照正则'[,.,a-zA-Z0-9()]',返回结果中包含空字符,如'2房2厅'后接空字符。为了删除列表中每个元素的前导和尾部空字符,使用列表表达式,使用字符串的strip方法来完成空字符的压缩。
