Python中正则表达式的巧妙使用
前言
正则表达式是从字符串中找到规则,并通过“抽象”符号来表达。例如,对于2、5、10、17、26、37等数字序列,如何计算第7个值,必须首先找到序列的规则,然后用n2+1来描述规则,然后得到第7个值为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模块中的sub函数的功能是替换,类似于字符串的replace方法,根据正则表达式用repl替换满足匹配的内容。该函数的参数如下:
sub(pattern, repl, string, count=0, flags=0)
pattern:patttern在findall函数中。
repl:指定替换的新值。
string:同findall函数中的string。
count:默认情况下,用于指定最多替换次数的所有替换。
flags:flags在findall函数中与flags相同。
字符串的匹配分割
re模块中的split函数是按照指定的正则表达式将字符串分开,类似于字符串的split方法。该函数的具体参数如下:
split(pattern, string, maxsplit=0, flags=0)
pattern:patttern在findall函数中。
maxsplit:默认情况下,用于指定分割次数的所有分割。
string:同findall函数中的string。
flags:flags在findall函数中与flags相同。
实战案例
如果已经掌握了上述函数和参数的含义,则需要通过案例进一步加强理解。以下是上述三个函数的例子:
#正则表达式re模块导入 importre #取出字符串string8中的所有天气状态 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:'优'}" #findall函数基于正则表达式使用 print(re.findall("tianqi:'(.*?)'",string8) #取出string9中所有含O字母的单词 string9='Together,wediscoveredthatafreemarketonlythriveswhentherearerulestoensurecompetitionand fairplay,Ourcelebrationofinitiativeandenterprise' #findall函数基于正则表达式使用 print(re.findall('w*ow*',string9,flags=re.I)) #删除string10中的标点符号、数字和字母 string10='据报道,四个蒸汽冷凝罐属于国际热核聚变试验堆(ITER)项目核二级压力设备已完成压力试验和真空 试验、氦气检漏试验、千斤顶试验、吊耳载荷试验、叠装试验等验收试验。' #Sub函数基于正则表达式使用 print(re.sub('[,。、a-zA-Z0-9();,'',string10) #将string11中的每个子部分分开 string11='2室2厅|101.62平|低区/7层 上海未来-浦东-金杨-2005年建设' #Split函数基于正则表达式 split=re.split('[-| ]',string11) print(split) #清洗分割结果 split_strip=[i.strip()foriinsplit] print(split_strip) out: ['晴','阴~小雨','小雨~中雨','中雨~小雨'] ['Together','discovered','only','to','competition','Our','celebration','of'] 据悉,本次运输的台式蒸汽冷凝罐属于国际热核聚变试验堆项目的核二级压力设备,已完成压力试验、真空试验、氦气泄漏试验、千斤顶试验 耳负荷试验、叠装试验等验收试验 ['2室2厅','101.62平','低区/7层','朝南','上海未来','浦东','金杨','2005年建'] ['2室2厅','101.62平','低区/7层','朝南','上海未来','浦东','金杨','2005年建']
以上结果在第一个例子中通过正则表达"tianqi:'(.*?)'"为了获取目标数据,如果不使用括号,就会产生类似的数据"tianqi:'晴'", "tianqi:'阴~小雨'"因此,加括号是为了分组,并且只返回组中的内容;
第二个例子没有将正则表达式写入圆括号。如果圆括号是相同的结果,则findall用于返回符合匹配条件的列表值。如果有括号,则只返回括号中的匹配值;
第三个例子采用替换方法,将所有标点符号更换为空字符,从而达到删除效果;
第四个例子是字符串的分割,如果直接遵循正则 '[,。、a-zA-Z0-9(); 如果分割,返回的结果包含空字符,如 '2室2厅' 后面有一个空字符。为了删除列表中每个元素的第一个和最后一个空字符,使用列表表达式,并结合字符串的strip来完成空字符的压缩。