正则表达式

正则表达式: 

一,简介:

正则表达式(或RE)是一种小型的,高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,再被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行

元字符:

.匹配除换行符 之外的任何单字符。要匹配 .,请使用 。

^匹配输入字符串的开始位置^

$匹配输入字符串的结尾位置

*匹配当前子表达式0次或者多次 

+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +

?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?

{}匹配前一个字符m次

[]常用来制定一个字符集,如[ab]匹配 a 或b;其他的元字符在[]中不起作用,除了【-】【^】

|指明两项之间的一个选择。要匹配 |,请使用 |

()被括起来的表达式将作为分组盲么,从表达式左边开始遇到每一个分组左括号(编号+1)

另外,分组表达式作为一个整体,可以后接数量词,表达式中 | 仅在改组有效

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符

import re

print(re.findall('q.w','dsqdw')) #通配符匹配一个字符
print(re.findall('q..w','dsqdgw'))# 匹配内容之间的内容 print(re.findall('a.c','dsa.cdc')) #转义字符 使后一个字符改变原来的意思 D:python3.5python.exe D:/untitled/python3/day正则练习.py ['qdw'] ['a.c'] Process finished with exit code 0
import re

print(re.findall('^a','asd')) 
print(re.findall('^as','asdf'))
print(re.findall('^asd','asdfd'))
print(re.findall('[^1-9]','ww3aa8.d')),'ww3aa8.d'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['a']
['as']
['asd']
['w', 'w', 'a', 'a', '.', 'd']

Process finished with exit code 0
print(re.findall('as$','dfas'))
print(re.findall('fd$','asdfd'))
print(re.findall('[1-9$]','ww3aa8.d'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['as']
['fd']
['3', '8']

Process finished with exit code 0
import re
print(re.findall('abc*','abcdefg'))
print(re.findall('as*','asssssddd'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['abc']
['asssssss']

Process finished with exit code 0
print(re.findall('as+','asddddd'))
print(re.findall('sd+','asdwsdd'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['as']
['sd', 'sdd']
print(re.findall('asc?','asa'))
print(re.findall('azx?','azxazxs'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['as']
['azx', 'azx']

Process finished with exit code 0
print(re.findall('ac{1}b','acbcc'))

匹配前一个字符m次或n次
print(re.findall('ab{1,2}c','abbcbb'))


D:python3.5python.exe D:/untitled/python3/lianxi.py
['acb']
['abbc']

Process finished with exit code 0
print(re.findall('z[ds]','ewzds')) 
print(re.findall('z[cs]','ewz')) 


D:python3.5python.exe D:/untitled/python3/day正则练习.py
['zd']
['zc']

Process finished with exit code 0
print(re.findall('zx|xz','zxssxzss'))
print(re.findall('zxc|cxz','sdzxcscxzds'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['zx', 'xz']
['zxc', 'cxz']

Process finished with exit code 0
print(re.findall('(asd)','asdasdasd'))
print(re.findall('za','aszasdza'))
print(re.findall('(za){2}',"zaza"))
print(re.findall('a(12)|(23)c','a123c

D:python3.5python.exe D:/untitled/python3/lianxi.py
['asd', 'asd', 'asd']
['za', 'za']
['za']
[('12', '')]

Process finished with exit code 0
print(re.findall('a.c','a.csd'))
print(re.findall(r'a\c','acd'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['a.c']
['a\c']

Process finished with exit code 0

 
d  匹配任何十进制数;它相当于类 [0-9]。
D  匹配任何非数字字符;它相当于类 [^0-9]。
s  匹配任何空白字符;它相当于类  [ fv]。
S  匹配任何非空白字符;它相当于类 [^ fv]。
w  匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
W  匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
: 匹配一个单词边界,也就是指单词和空格间的位置。  单词中间的符号代表两个,两边代表两个
 就是用在你匹配整个单词的时候。 如果不是整个单词就不匹配。

(r'd*','xin123456789')) #输出数字
print(re.findall(r'D*','kai1234!@#$%45623')) #非数字
print(re.findall(r's*','kai    5132')) #匹配所有的空格
print(re.findall(r'S*','kai8465')) #匹配非空白字符串
print(re.findall(r'w*','kai#2454#%^%$#')) #匹配任何数字,字符串
print(re.findall(r'W*','kai^%$#5632')) #匹配任何非字符和数字
print(re.findall(r'','asdadda')) #匹配一个单词边界,也就是指单词和空格键的位置
print(re.findall(r'xin','xin,sad')) #匹配单词:

 re模块的内置功能:

compile()

编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

语法:

re.compile(pattern,flags=0)

pattern: 编译时用的表达式字符串。

flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

rr = 'kai xin is  sd sood gesd good '
xx = re.compile(r'w*oow*')
print(xx.findall(rr))

D:python3.5python.exe D:/untitled/python3/day正则练习.py
['sood', 'good']

Process finished with exit code 0

re.I 使匹配对大小写都不敏感
re.M 多行匹配,影响^ 和$
re.S 使 .匹配包括换行在内的所有字符,每行都匹配
re.L 做本地化识别(locale- aware)匹配
re.U 根据Unicode 字符集解析字符,这个标志影响w W;B
re.X 通过更灵活的格式以便将正则表达式写的更易于理解

xin = re.findall('.','asd
ds',re.S)
print(xin)    #匹配所有字符包括换行符
print (re.findall('.','sa
as',re.M))
print (re.findall('.','sa
as',re.S))# 匹配任何字符包括换行符在内

D:python3.5python.exe D:/untitled/python3/day正则练习.py
['a', 's', 'd', '
', 'd', 's']
['s', 'a', 'a', 's']
['s', 'a', '
', 'a', 's']

Process finished with exit code 0

 search 浏览全部字符串,匹配第一个符合规则的字符串
法:search:re.search(pattren,string,filsgs= 0)

一旦匹配成功,就是一个match object 对象,

而match object 对象拥有以下方法:

group() 返回被 RE 匹配的字符串

start() 返回匹配开始的位置

end() 返回匹配结束的位置

span() 返回一个元组包含匹配 (开始,结束) 的位置

group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串

1. group()返回re整体匹配的字符串,

2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常

3.groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。

 
print(re.search('dcom','wee.4comsdda.5com').group())# 匹配数字后有com的
print(re.search('dcom','ww.5comdsada.2com').group()) #5com 返回被RE匹配的字符串
print(re.search('dcom','wdd.5comsads.2com').start()) #匹配开始的位置
print(re.search('dcom','www.5comsa.2com').end())  #匹配结束的位置
print(re.search('dcom','wdd.5comsdad.2com').span()) #匹配开始结束的位置
xin = re.search('([d]*)([a-z]*)([d]*)','123dbc452').groups()
print(xin)  # 返回一个包含正则式中所有字符串的元祖
 
a = '123xin321'
print(re.search("([d]*)([a-z]*)([d]*)",a).group(0))  #默认0匹配的全部租
print(re.search('([d]*)([a-z]*)([d]*)',a).group(1)) #匹配第一个组
print(re.search('([d]*)([a-z]*)([d]*)',a).group(2)) #匹配第二个组
print(re.search('([d]*)([a-z]*)([d]*)',a).group(3)) #匹配第三个组
分组:
xin = 'guo kai xin hoaniubi 19'
kai =re.search('(w+)',xin)
print(kai.group())
print(kai.groups())
print(kai.groupdict())
D:python3.5python.exe D:/untitled/python3/day正则练习.py
guo
('guo',)
{}


ds = 'sdfghjz x cvbn msd fghjdcvbnm10'
s = re.search('(w+).*(?P<name>d)$',ds)
print(s.group())
print(s.groups())   #()组
print(s.groupdict())

D:python3.5python.exe D:/untitled/python3/day正则练习.py
sdfghjz x cvbn msd fghjdcvbnm10
('sdfghjz', '0')
{'name': '0'}

Process finished with exit code 0

matoch 只匹配开头

re.match(pattern,string,flags=0)
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小 多行匹配等
print(re.match('XIN','XINxsss.dhsajk').group()) #区分大小写
print(re.match('xin','Xinsdasd.dsad',re.I).group()) #加上I就不区分大小写

D:python3.5python.exe D:/untitled/python3/day正则练习.py
XIN
Xin
Process finished with exit code 0
分组:
xin = 'kai xin guo xiao huo zi'
kai = re.match('kw+',xin)  
print(kai.group())      #获取匹配开头的所有结果
print(kai.groups())    #获取模型中匹配到的分组结果
print(kai.groupdict()) #获取模型中匹配到的分组结果 # 执行结果: kai () {}
有分组:
为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)

xin = 'kai xin guo xiao huo zi' 
kai = re.match('k(w+)',xin) 
print(kai.group())     #获取匹配开头的所有结果 
print(kai.groups())   #获取模型中匹配到的分组结果 
print(kai.groupdict()) #获取模型中匹配到的分组结果 
#执行结果: kai ('ai',) {}

kai = re.match('(k)(w+)',xin)#获取匹配开头的所有结果  
print(kai.group()) 
print(kai.groups()) 
print(kai.groupdict()) 
执行结果: kai ('k', 'ai') {}

kai = re.match('(?P<n1>k)(?P<n2>w+)',xin)  
print(kai.group()) 
print(kai.groups()) 
print(kai.groupdict())   #?p<n1>  代表gpoutdict中的key
执行结果: 
kai 
('k', 'ai') 
{'n2': 'ai', 'n1': 'k'} 
print(re.match('xin$','Xinsdasd.dsad',re.I))

D:python3.5python.exe D:/untitled/python3/day正则练习.py
None

Process finished with exit code 0

以***开始匹配,¥以***结尾的
sum = re.match("(.*xin$)","xindffsfsdf.xin").group()
print(sum)

D:python3.5python.exe D:/untitled/python3/day正则练习.py
xindffsfsdf.xin

Process finished with exit code 0    这是个疑难杂症
xin = 'guo4kai5xin'
kai = re.sub('d+','xxx',xin)
print(kai)
打印结果
 
guoxxxkaixxxxin

sub:

替换string中每一个匹配的子串后返回替换后的字符串

语法re.sub(pattern,repl,steing,,max(0))

subn:

替换的次数

 

xin = 'guo4kai5xin'
new_str,count = re.subn('d+','xxx',xin)
print(new_str,count)
打印结果
guoxxxkaixxxxin 2
import re
xin = re.sub('x.i','xin','I xi Z,I xi A I xi B')
print(xin)
print(re.sub('[1-3]','S','SSSS12346'))

print(re.subn('k.i','xin','I kai A I kai B I kaiC'))
print(re.subn('[1-3]','s','ss132456'))


D:python3.5python.exe D:/untitled/python3/lianxi.py
I xi Z,I xi A I xi B
SSSSSSS46
('I xin A I xin B I xinC', 3)
('sssss456', 3)

Process finished with exit code 0

split:

分割 切片函数。使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片

 

x = re.compile(r'd+')
print(x.split('q1q2q3'))
print(re.split('d','q1q2q3'))
print(re.split('[a-z]','q1q2q3'))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['q', 'q', 'q', '']
['q', 'q', 'q', '']
['', '1', '2', '3']

Process finished with exit code 0

s = 'q1,q2,q3'
print(re.split('/s*/s*',s))

D:python3.5python.exe D:/untitled/python3/lianxi.py
['q1,q2,q3']

Process finished with exit code 0
又无分组:
无分组
xin = 'hello and xin aos erpi 20'
kai = re.split('aw+',xin,)
print(kai)
kai = re.split('aw+',xin,1) #分割一次
print(kai)
打印结果
['hello ', ' xin ', ' erpi 20']
['hello ', ' xin aos erpi 20']
有分组

kai = re.split('(aw+)',xin,)
print(kai)
kai = re.split('(aw+)',xin,1)
print(kai)
kai = re.split('a(w+)',xin,1)
print(kai)
打印结果
['k', 'ai', ' xin guo xi', 'ao', ' huo zi']
['k', 'ai', ' xin guo xiao huo zi']
['k', 'i', ' xin guo xiao huo zi']

 

findall()以列表形式返回所有匹配的字符串,可以获取字符串中所有匹配的字符串

 


 
p = re.compile(r'd+')
print(p.findall('one1two2three3four4')) #匹配所有的数字
text = 'JGood is a handsome boy,he is,handsome and cool,clever,ane so on...'
print(re.findall(r'w*oow',text)) #匹配前后都有字符,中间是00的
print(re.findall(r'(w)*oo(w)*',text))  #表示子表达式


D:python3.5python.exe D:/untitled/python3/lianxi.py
['1', '2', '3', '4']
['JGood', 'cool']
[('G', 'd'), ('c', 'l')]

Process finished with exit code 0
有无分组
n = re.findall('d+wd+','q2b3c4d5')
print(n) #从前向后匹配 d 数字 w 字母
n = re.findall('(d+)(w)*(d+)','q2b3c4d5')
print(n)
打印结果

['2b3', '4d5']
[('2', 'd', '5')]

kai = 'guo kaixin fe' # 默认的都是goups模式
xin = re.findall('kw+',kai)
print(xin)
xin = re.findall('(kw+)',kai)
print(xin)
xin = re.findall('(k)(w+)',kai)
print(xin)
xin = re.findall('(k)(w+)(n)',kai)
print(xin)
xin = re.findall('(k)(w+(i))(n)',kai)
print(xin)

打印结果:
['kaixin']
['kaixin']
[('k', 'aixin')]
[('k', 'aixi', 'n')]
[('k', 'aixi', 'i', 'n')]

n = re.findall('(ddsa)*','as5dsangnb5dsaare')
print(n)
n = re.findall('(ddsa)+','as5dsangnb5dsaare')
print(n)
打印结果

['', '', '5dsa', '', '', '', '', '5dsa', '', '', '', '']
['5dsa', '5dsa']

 finditer 搜索string 返回一个顺序访问每一个匹配结果(Match对象)的迭代器  

p = re.compile(r'd+')
for i in p.finditer('q1,q2,q3'):
    print(i.group())
    
D:python3.5python.exe D:/untitled/python3/lianxi.py
1
2
3

Process finished with exit code 0

p = re.compile(r'd+')
for i in p.finditer('q1,q2,q3'):
    print(i.span())

D:python3.5python.exe D:/untitled/python3/lianxi.py
(1, 2)
(4, 5)
(7, 8)
Process finished with exit code 0

 

 

 

 

 

 






 


 


原文地址:https://www.cnblogs.com/guokaixin/p/5507034.html