我们使用办公软件如Word、Excel等工具的时候,如果我们想搜索某个字符、人名等,就会使用CTRL+F,进行搜索。
在Python中给我们提供的有正则表达式来查找文本:
比如我们使用re模块匹配日期:
>>> import re >>> myexpress=re.compile(r‘\d{4}-\d{1,2}-\d{1,2}‘) >>> myexpress re.compile(‘\\d{4}-\\d{1,2}-\\d{1,2}‘) >>> type(myexpress) <class ‘re.Pattern‘> >>> result=myexpress.search(‘我在1998-7-1日去过北京‘) >>> result <re.Match object; span=(2, 10), match=‘1998-7-1‘> >>> result.group() ‘1998-7-1‘ >>> type(result) <class ‘re.Match‘>
说明:
注意:
一个()是一组,正则表达式中如果出现多个(),那么使用group()方法的时候得向group()中传入整数作为下标。其实我们还可以通过groups()来获取所有分组的匹配数据,那么groups()返回的是一个tuple。
>>> group_express= re.compile(r‘(\d{4})-(\d{1,2})-(\d{1,2})‘) >>> group_express re.compile(‘(\\d{4})-(\\d{1,2})-(\\d{1,2})‘) >>> matchs=group_express.search(‘在1993-12-26号的时候他出生了,那2020-2-22的时候他几岁?‘) >>> matchs <re.Match object; span=(1, 11), match=‘1993-12-26‘> >>> matchs.group(0) ‘1993-12-26‘ >>> matchs.group(1) ‘1993‘ >>> matchs.group(2) ‘12‘ >>> matchs.group(3) ‘26‘ >>> match_tuple=matchs.groups() >>> match_tuple (‘1993‘, ‘12‘, ‘26‘)
说明:使用几个(),可以将正则表达式进行分组;match对象调用groups()方法得到的是一个元组。
该方法能够返回一组字符串,包含整个字符串中的所有匹配。findall返回的是个列表。
>>> import re >>> reg=re.compile(r‘\d{4}-\d{1,2}-\d{1,2}‘) >>> mylis=reg.findall(‘我在1984-7-11日,在波尔多酒庄买到了一瓶1573-12-1日生产的洋河天之蓝‘) >>> mylis [‘1984-7-11‘, ‘1573-12-1‘]
>>> mystr=‘‘‘ ... woshinide xiaoya xiapingguo ... zenme aini 1314 wodou bu xianduo‘‘‘ >>> mystr ‘\nwoshinide xiaoya xiapingguo\t\n\tzenme aini 1314 wodou bu xianduo‘ >>> space_lis=re.compile(r‘\s+‘).findall(mystr) >>> space_lis [‘\n‘, ‘ ‘, ‘ ‘, ‘\t\n\t‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘] >>> number_lis=re.compile(r‘\d+‘).findall(mystr) >>> number_lis [‘1314‘] >>> char_lis=re.compile(r‘[a-z]+‘).findall(mystr) >>> char_lis [‘woshinide‘, ‘xiaoya‘, ‘xiapingguo‘, ‘zenme‘, ‘aini‘, ‘wodou‘, ‘bu‘, ‘xianduo‘]
说明:
插入字符(^)和美元字符()$:
一个表示匹配开始--比如r‘^Hello‘,表示以Hello开始的字符串能够匹配上;
一个表示匹配结束--比如r‘Hello$‘,表示以Hello结束的字符串能够匹配上。
>>> ex=re.compile(r‘^\d+$‘) >>> str1=‘asdfasdf322qw4123‘ >>> str2=‘12123s8dasdf8112‘ >>> str3=‘1212312312312312‘ >>> ex.findall(str1) [] >>> ex.findall(str2) [] >>> ex.findall(str3) [‘1212312312312312‘]
和字符串类型中的split()将字符串按照某个字符分割成列表是一样的,只不过我们这里是按照规则拆分成列表。
>>> sp_str=‘12-121212*2314sdsfs*asdfask-32fq3‘ >>> re.split(r‘[-*]‘,sp_str) [‘12‘, ‘121212‘, ‘2314sdsfs‘, ‘asdfask‘, ‘32fq3‘]
字符串不识别连续空格,下面这个例子能看出来正则的split()比str的split()要厉害的地方:
>>> sss.split(‘ ‘) [‘我‘, ‘‘, ‘‘, ‘爱你‘, ‘‘, ‘宝宝‘] >>> sss=‘我 爱你 宝宝‘ >>> sss.split(‘ ‘) [‘我‘, ‘‘, ‘‘, ‘爱你‘, ‘‘, ‘宝宝‘] >>> re.split(r‘\s+‘,sss) [‘我‘, ‘爱你‘, ‘宝宝‘]
说明:字符串不能识别连续空格,所以最后我们使用字符串的分割函数难以达到效果。
类似字符串类型中的replace()方法,第一个参数是规则,第二个参数是拿来用于替换的,第三个是目标字符串,第四个参数是替换次数。
>>> ss=‘小了白了兔白了又了白‘ >>> re.sub(r‘了‘,‘‘,ss) ‘小白兔白又白‘
原文:https://www.cnblogs.com/bigbosscyb/p/12350527.html