首页 > 代码库 > Python高手之路【五】python基础之正则表达式

Python高手之路【五】python基础之正则表达式

下图列出了Python支持的正则表达式元字符和语法:

技术分享

字符点:匹配任意一个字符

import re
st = python
result = re.findall(p.t,st)
print(result)

字符^:匹配以什么开头

import re
st = python
result = re.findall(^py,st)
print(result)

字符$:匹配以什么结尾

import re
st = python
result = re.findall(n$,st)
print(result)

字符*:匹配任意次,包括0次

import re
st = I looooooove python
result = re.findall(lo*ve,st)#字符0可以没有,也可以无限多个,都可以匹配
print(result)

字符+:匹配一次或多次

import re
st = I looooooove python
result = re.findall(lo+ve,st)#字符0没有就匹配不上
print(result)

字符?:匹配0次或一次

import re
st = I love python
result = re.findall(lo?ve,st)#字符0没有也能匹配
print(result)

{m}:匹配前一个字符的m次

import re
st = I loooove python
result = re.findall(o{3},st)#匹配3个o字符
print(result)

{m,n}:匹配前一个字符的m-n次

import re
st = I loooove python
result = re.findall(lo{1,4}ve,st)
print(result)

[abc]或[a-c]:匹配[]中的任意一个字符

import re
st = I loooove python
result = re.findall(l[0-z]*e,st)
print(result)

[a|b]:匹配字符a或字符b

import re
st = I lbve python
result = re.findall(l[a|b]ve,st)
print(result)

[^1-9]:[]里出现^字符,表示非的意思,并不表示以什么开头的意思

import re
st = I lb2ve python6
result = re.findall([^0-9],st)
print(result)
##########################################
[I,  , l, b, v, e,  , p, y, t, h, o, n]

 \:

  • 反斜杠后边跟元字符去除特殊功能
  • 反斜杠后边跟普通字符实现特殊功能
  • 引用序号对应的字组所匹配的字符串

数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

import re
result = re.findall(rab*,abbbc)
print(result)
##########################################
[abbb]
import re
result = re.findall(rab*?,abbbc)#取消贪婪模式
print(result)
##########################################
[a]

re.match() 从头匹配

import re
origin = "hello poe bcd jet who are you 20"
r = re.match("h\w+",origin)
print(r.group())    #获取匹配到的所有结果
print(r.groups())   #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
()
{}
r = re.match("(h)(\w+)",origin)
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
(h, ello)
{}
r = re.match("(?P<n1>h)(?P<n2>\w+)",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
hello
(h, ello)
{n2: ello, n1: h}

re.search() 浏览全部字符串,匹配第一个符合规则的字符串

与re.match()用法基本一样

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.search("p(\w+).*(?P<name>\d)$",origin)
# ?P<n1> :以键为n1,值为匹配到的这个分组,保存到字典中!?P<>这个是固定的写法
print(r.group())        #获取匹配到的所有结果
print(r.groups())       #获取模型中匹配到的分组结果
print(r.groupdict())    #获取模型中匹配到的分组结果
##########################################
poe bcd jet poe who are you 20
(oe, 0)
{name: 0}

re.findall() 将匹配的所有内容都放置在一个列表中

注:此方法空匹配也会保存到结果中,如:

result = re.findall("","a2b3c4d5")
print(result)
print(len(result))
##########################################
[‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘]

re.findall()方法要注意有分组的情况:

#没有分组的情况
r = re.findall("p\w+",origin)
print(r)
##########################################
[poe, poe]
#有分组的情况,会把匹配到的分组放到结果列表中
r = re.findall("p(\w+)",origin)
print(r)
##########################################
[oe, oe

re.finditer() 

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.finditer("(p)(\w+(e))",origin)
for i in r :
    print(i.group())
    print(i.groups())
    print(i.groupdict()) 

re.split() 

无分组情况,匹配到的字符串不会出现在匹配结果中:

 

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a\w+",origin,1)
print(r)
##########################################
[hello poe bcd jet poe who ,  you 20]

 

有分组情况,匹配到的分组字符串也会出现在匹配结果中:

import re
origin = "hello poe bcd jet poe who are you 20"
r = re.split("a(\w+)",origin,1)
print(r)
##########################################
[hello poe bcd jet poe who , re,  you 20]

 

re.sub() 正则替换

import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str = re.sub("\d+","KKK",origin,1)#参数1表示只替换匹配到的第一个字符串,如果是2表示替换匹配到的前2个字符串
print(new_str)
##########################################
KKKyiuoosfdKKKkuiuadf789v,xznfa978

re.subn()只是比re.sub()多返回一个数据,如:

import re
origin = "1yiuoosfd234kuiuadf789v,xznfa978"
new_str,count = re.subn("\d+","KKK",origin)#参数1表示只替换匹配到的第一个字符串
print(new_str,count)
##########################################
KKKyiuoosfdKKKkuiuadfKKKv,xznfaKKK 4

这个4表示替换匹配了4次

Python高手之路【五】python基础之正则表达式