正则表达式练习记录

1、首先要导入python的re模块。

2、元字符. ^ $ * + ? {} [] \ | ()

re模块中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字符串'dit dot det,dct dit dot'中匹配'dit'结果为:


str1='dit dot det,dct dit dot'

printre.findall('dit',str1)

结果:

['dit','dit']


|作用:'dit|dct'表示dit或者dct。

str1='dit dot det,dct dit dot'

printre.findall('dit|dct',str1)

结果:

['dit','dct','dit']


[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:

str1='dit dot det,dct dit dot'

printre.findall('d[ic]t',str1)

结果:

['dit','dct','dit']


^作用一:[^ic]中^表示否定,即除了i和c:

str1='dit dot det,dct dit dot'

printre.findall('d[^ic]t',str1)

结果:

['dot','det','dot']


^作用二:^dit表示子串dit在开头位置,而dct不是在开头:


str1='dit dot det,dct dit dot'

printre.findall('^dit',str1)

printre.findall('^dct',str1)

结果:

['dit'][]


$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:

str1='dit dot det,dct dit dot'

printre.findall('dot$',str1)

printre.findall('dct$',str1)

结果:

['dot'][]


.作用:d.t表示d与t之间省略了一个任意字符:

str1='dit dot det,dct dit dot'

printre.findall('d.t',str1)

结果:

['dit','dot','det','dct','dit','dot']


+作用:di+t表示d与t之间省略了一个或多个'i':

str1='d dt dit diit det'

printre.findall('d.+t',str1)

结果:

['dit','diit']


*作用:di*t表示d与t之间省略了零个至多个'i':

str1='d dt dit diit det'

printre.findall('d.*t',str1)

结果:

['dt','dit','diit']

经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:

str1='d dt dit diit det'

printre.findall('d.+t',str1)

printre.findall('d.*t',str1)

结果:

['d dt dit diit det']['d dt dit diit det']


?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')

str1='d dt dit diit det'

printre.findall('d.+?t',str1)

结果:

['dit','dot','det','dct','dit','dot']

?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:

str1='d dt dit diit det'

printre.findall('di?t',str1)

结果:

['dt','dit']


{}作用一:di{n}t表示d和t之间有n个'i':

str1='dt dit diit diiit diiiit'

printre.findall('di{2}t',str1)

结果:

['diit']

{}作用二:di{n,m}t表示d和t之间有n到m个'i':

str1='dt dit diit diiit diiiit'

printre.findall('di{1,3}t',str1)

结果:

['dit','diit','diiit']

其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:

str1='dt dit diit diiit diiiit'

printre.findall('di{1,}t',str1)

printre.findall('di{,3}t',str1)

printre.findall('di{,}t',str1)

结果:

['dit','diit','diiit','diiiit']

['dt','dit','diit','diiit']

['dt','dit','diit','diiit','diiiit']


\作用一:取消元字符,变成转义字符:

str1='^abc ^abc'

printre.findall('^abc',str1)

printre.findall('\^abc',str1)

结果:

[]['^abc','^abc']

\作用二:预定义字符

str1='12 abc 345 efgh'

printre.findall('\d+',str1)

printre.findall('\w+',str1)

结果:

['12','345']

['12','abc','345','efgh']


()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:

str1='12abcd34'

printre.findall('12abcd34',str1)

printre.findall('1(2a)bcd34',str1)

printre.findall('1(2a)bc(d3)4',str1)

结果:

['12abcd34']

['2a']

[('2a','d3')]


3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。

re.findall(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。

str1='ab cd'

printre.findall('\w+',str1)

结果:['ab', 'cd']

re.finditer(pattern,string,flags = 0)

作用:其功能与re.findall相同,但结果以迭代器的形式返回。

str1='ab cd'

iter1=re.finditer('\w+',str1)

forainiter1:

printa.group(),a.span()

结果:

ab (0, 2)

cd (3, 5)

(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)

re.search(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。


str1='ab cd'

result=re.search('cd',str1)

ifresult==None:

print'None'

else:

printresult.group(),result.start(),result.end()

结果:cd 3 5

re.match(pattern,string,flags = 0)

作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。

str1='ab cd'

result=re.match('cd',str1)

ifresult==None:

print'None'

else:

printresult.group(),result.start(),result.end()

结果:None

re.compile(pattern,flags = 0)

作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。

str1='ab cd'

pre=re.compile('ab')

printpre.findall(str1)

结果:['ab']

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

作用:在string匹配pattern的时候做分割:

str1='ab.c.de'

str2='12+34-56*78/90'

printre.split('\.',str1)

printre.split('[\+\-\*/]',str2)

结果:

['ab', 'c', 'de']

['12', '34', '56', '78', '90']

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

作用:在string当中把满足pattern正则的字串替换成repl:

str1='abcde'

printre.sub('bc','123',str1)

结果:a123de

re.subn(pattern,repl,string,count = 0,flags = 0)

作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次

str1='abcdebce'

printre.subn('bc','123',str1)

结果:('a123de123e', 2)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容