python的正则表达式

re模块

re.match 尝试从字符串的起始位置匹配一个模式,如果不是其实位置匹配成功的话,match()就返回None.[从起始位置开始匹配,
只进行一次匹配]
re.search 扫描整个字符串并返回第一个成功的匹配。【从任何位置开始匹配,只进行一次匹配】
re.compile 用于编译正则表达式,生成一个正则表达式(Pattern)对象。
re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。【全部匹配,返回列表】

re.match与re.search、re.findall的区别:
如:匹配hello,world中的he.
re.match('he','hello,world')即可。
如果匹配其中的wor,用re.match()则不可以。
必须用re.search('wor','hello,world')

res=re.compile(r'd+')
reg=re.findall(res,'running, 123 haha, 456')
结果是:['123','456']

re.sub的用法:
text='hello world haha'
pattern=r's+'

re.sub(pattern,'_',text)
结果是:'hello_world_haha'
 
text='hello world haha'
pattern=r's+'

re.sub(pattern,'_',text,count=1)【参数count=1代表也许找到很多,但只进行一次替换】
结果是:'hello_world haha'



匹配出s的值。

s1=<geometry s="358.557561656985" x="555763.3391" y="3465063.4074" hdg="3.12539407058811757878" length="14.00167190766740610286">

s_value = re.findall('.*s="(.*)" x=.*',s1)
结果:['358.557561656985']
再举一例:
line='<geometry s="0" x="556181.3391" y="3465061.8535" hdg="3.19228842605259499621" length="7.19637334660478700243">'
匹配出s的值,并用数字(字符)123.456代替:
dda=re.compile('.*s="(.*)" x=.*')
ddb=re.search(dda,line).group(1)
need=re.sub(ddb,'123.456',line,count=1)


#第一例:
import re
str1 = 'ditqq dot det,dct dit dot'
print(re.findall('dit',str1))
print(re.match('dit',str1).group())
print(re.match('dit',str1))



'''

这说明:findall()匹配出来所有符合要求的字符串,并返回一个列表
match().group只匹配符合要求的第一个字符串,返回的是一个字符串
不加.group的话,返回第一个匹配的字符串和位置
['dit', 'dit']
dit
<_sre.SRE_Match object; span=(0, 3), match='dit'>
'''
#第二例:
import re
str1 = 'dit dot det,dct ditmm dot'
print(re.findall('dit|dct|det',str1))
print(re.match('det|dit|dct',str1))
'''
['dit', 'det', 'dct', 'dit']
<_sre.SRE_Match object; span=(0, 3), match='dit'>
'''
#第三例:
#[]表示字符集,这个和'dit|dot|dct'是等价的
import re
str1 = 'dit dot det,dct dit dot'
print(re.findall('d[ioc]t',str1))
print(re.match('d[ioc]t',str1))
'''
['dit', 'dot', 'dct', 'dit', 'dot']
<_sre.SRE_Match object; span=(0, 3), match='dit'>
'''
#第四例:
#^符号表示“排除”
import re
str1 = 'dit dot det,dct dit dot'
print(re.findall('d[^ic]t',str1))
print(re.match('d[^ic]t',str1))
print(re.match('d[i]t',str1))
print(re.match('d[o]t',str1))
'''
.match()必须是从字符串的开头进行匹配
['dot', 'det', 'dot']
None
<_sre.SRE_Match object; span=(0, 3), match='dit'>
None
'''
#第五例 ^还可以标识以...开头
import re
str1 = 'dit dot det,dct dit dot'
print(re.findall('^dit',str1))
print(re.findall('^dct',str1))
print(re.match('^dot',str1))
print(re.match('^dit',str1))
'''
['dit']
[]
None
<_sre.SRE_Match object; span=(0, 3), match='dit'>
'''
#第六例:
import re
str1 = 'dit dot det,dct dit dot'
print(re.findall('dot$',str1))
print(re.findall('dct$',str1))
print(re.match('dot$',str1)) #只能是开头匹配,无法指定末尾匹配
'''
['dot']
[]
None
'''
#第七例:
# d.t表示d与t之间省略了任意一个字符:
# *表示至少零个
# +表示至少一个
import re
str1 ='dict ### dot det,,,,dct dit dot'
print(re.findall('d.t',str1))
print(re.findall('d.*t',str1))
print(re.findall('d.+t',str1))
'''
['dot', 'det', 'dct', 'dit', 'dot']
['dict ### dot det,,,,dct dit dot']
['dict ### dot det,,,,dct dit dot']
'''
#第八例:
# *表示匹配0个或多个
# +表示匹配1个或多个
import re
str1 = 'd dt dit diit det'
print(re.findall('d.+t',str1))
print(re.findall('d.*t',str1))
print(re.match('d.*t',str1))

'''
['d dt dit diit det']
['d dt dit diit det']
<_sre.SRE_Match object; span=(0, 17), match='d dt dit diit det'>
'''
#第九例:
# *表示匹配0个或者一个
# +表示匹配0个或者一个
# .findall()函数从任意位置处开始匹配
# .match()函数从开头处开始匹配
import re
str1 = 'cd dt dit diit det'
print(re.findall('d.+t',str1))
print(re.findall('d.*t',str1))
print(re.match('d.*t',str1))

'''
['d dt dit diit det'] 
['d dt dit diit det']
None
'''
#第十例:
#贪婪匹配
#?作用一:看.+的匹配结果,'dit''dot'也满足'd.+t'的匹配条件,而输出的
# 却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如
# 果要输出最短的匹配字串,只需在'+'后面加上'':(注:对于'*'也是一样,只
# 需在'*'后面加上'')
import re
str1 = 'd dt dit diit det'
print(re.findall('d.+t',str1)) #贪婪模式
print(re.findall('d.+?t',str1)) #加问号变成非贪婪模式
print(re.findall('d.*?t',str1)) #非贪婪模式
print(re.match('d.*t',str1))
print(re.match('d.*?t',str1)) #非贪婪模式

'''
贪婪模式就是一口吃个胖子,非贪婪模式就是细嚼慢咽
['d dt dit diit det']
['d dt', 'dit', 'diit', 'det']
['d dt', 'dit', 'diit', 'det']
<_sre.SRE_Match object; span=(0, 17), match='d dt dit diit det'>
<_sre.SRE_Match object; span=(0, 4), match='d dt'>
'''
#第十一例:
# ?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:
import re
str1 = 'dt dt dit diit det'
print(re.findall('dii?t',str1))
print(re.match('di?t',str1))
'''
['dit', 'diit']
<_sre.SRE_Match object; span=(0, 2), match='dt'>
'''
#第十二例:
# {}作用一:di{n}t表示d和t之间有n个'i':
import re
str1 = 'dt dit diit diiit diiiit'
print(re.findall('di{2}t',str1))

'''
['diit']
'''
#第十三例:
# {}作用二:di{n,m}t表示d和t之间有n到m个'i'
import re
str1 = 'dt dit diit diiit diiiit'
print(re.findall('di{1,3}t',str1))

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

 

#第十四例:
# 其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;
# {,}表示任意个,和'*'功能一样:
import re
str1 = 'dt dit diit diiit diiiit'
print(re.findall('di{1,}t',str1))
print(re.findall('di{,3}t',str1))
print(re.findall('di{,}t',str1))

'''
['dit', 'diit', 'diiit', 'diiiit']
['dt', 'dit', 'diit', 'diiit']
['dt', 'dit', 'diit', 'diiit', 'diiiit']
'''
#第15例:
# 作用一:取消元字符,变成普通字符:
import re
str1 = '^abc ^abc'
print(re.findall('^abc',str1))
print(re.findall('^abc',str1))

'''
[]
['^abc', '^abc']
'''
#第16例:
# 作用二:跟普通字符放在一起,让普通字符变成转义字符:
import re
str1 = '12 abc 345 efgh'
print(re.findall('d+',str1))
print(re.match('d+',str1))
print(re.findall('w+',str1))
'''
['12', '345']
<_sre.SRE_Match object; span=(0, 2), match='12'>
['12', 'abc', '345', 'efgh']
'''
#第17例:
# ()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:
import re
str1 = '12abcd34'
print(re.findall('12abcd34',str1))
print (re.findall('1(2a)bcd34',str1))
print (re.findall('1(2a)bc(d3)4',str1))
'''
['12abcd34']
['2a']
[('2a', 'd3')]
'''
#第18例:
# re模块里的主要方法:findall()、finditer()、match()、search()、compile()、
# split()、sub()、subn()。
# re.findall(pattern,string,flags = 0)作用:在string中从左往右搜索与
# pattern(有样品的意思)匹配的字串,结果以list形式返回。
import re
str1 = 'ab _  + # 321_cd'
print(re.findall('w+',str1))

'''
['ab', '_', '321_cd']
'''
#第19例:
# re.compile(pattern,flags = 0)
# 作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,
# 可以大幅提高匹配速度。
import re
str1 = 'ab cd'
pre = re.compile('ab')
print(pre.findall(str1))
'''
本例重要!
['ab']
'''
#第20例:
# re.split(pattern,string,maxsplit = 0,flags = 0)
# 作用:在string匹配pattern的时候做分割:
import re
str1 = 'ab.c.de'
str2 = '12+34-56*78/90'
print(re.split('.',str1))
print(re.split('[+-*/]',str2))
print(str1.split('.'))
print(str2.split('+'))
'''
['ab', 'c', 'de']
['12', '34', '56', '78', '90']
['ab', 'c', 'de']
['12', '34-56*78/90']
'''

 

#第21例:
# re.search(pattern,string,flags = 0)
# 作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,
# 否则返回一个search实例。
import re
str1 = 'ab cd'
result = re.search('cd',str1)
if result == None:
  print('None')
else:
  print(result.group(),result.start(),result.end())
'''
cd 3 5
'''
#第22例:
# re.subn(pattern,repl,string,count = 0,flags = 0)
# 作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
import re
str1 = 'abc  de  bce'
print(re.subn('bc','123',str1))

'''
('a123  de  123e', 2)
'''
'''
代码 说明
. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意的空白符
d 匹配数字
 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
'''
*   重复零次或多次
+ 重复一次或多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次到多次
{,m} 重复0次到m次
{n,m} 重复n到m次

W  匹配任意不是字母,数字,下划线,汉字的字符
S 匹配任意不是空白符的字符
D 匹配任意非数字的字符
B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
原文地址:https://www.cnblogs.com/yibeimingyue/p/9911667.html