Python正则表达式

正则表达式中的一些符号:

 " . "是可以匹配到任意一个字符.

 " * "可以匹配到前面字符的0或很多,例如b*能匹配到一个b或者bbbb+个.

" ^ "是开头匹配模式 ,例如^b.*就是匹配以开头为b的任意长度字符串,可以匹配到‘ ba ’也可以匹配到‘basdwa’。

"$"结尾匹配,例如b$就是以b结尾的字符串。可以匹配到 'asdasb' 或者 'asb'也可以是'b'

结合上面的符号我们进行一个例子:

import re  #导入re模块

line = "bobby123"  #需要匹配的字符串

# 下面的 ^b.*3$ 大意是:以b开头,以3结尾,中间任意长度的字符串。

model="(^b.*3$)"  #匹配模式,其中的圆括号()是提取字串。

result = re.match(model, line) #match是re模块其中的一个匹配函数,第一个参数是匹配模式,第个参数是匹配字符串

if result:

    print("true") #输出true   #结果为bobby123

其中的圆括号是正则表达式的组,例如你想对网址www.baidu.com进行字符串baidu提起,而不想拿到前面的‘www.'和'.com'的话。只要把需要的部分用圆括号括起来就好了,例如匹配模式可以这么写" .*(baidu).* " 看下面代码例子:

import re

line = "www.baidu.com"

model=".*(baidu).*"

result= re.match(model, line)

print(result.group(1)) #结果为' baidu '


其中的result(1)就是对组里面的不同组进行提取,例如上面的"www.baidu.com"就是result(0)整个字符串。


“?”是非贪婪模式,根据字符串去匹配最大的长度。为了说明这个字符我们先来看一下什么是贪婪模式:

#贪婪模式

#贪婪匹配模式,反向匹配,就是从右到左开始进行匹配

line = "bobby123" #我们要从此字符串中提取bob

model=".*(b.*b).*" #这段意思是:通过圆括号提取第一个字符是b,中间任意长度字符,结尾是b的字符串。

result= re.match(model, line)

print(result.group(1)) #结果为'bb ' 

非贪婪模式:

 line = "bobby123" 

model=".*?(b.*?b).*"  #非贪婪模式,会让匹配从左到右开始匹配

result= re.match(model, line) 

print(result.group(1)) #结果为'bob' ,如果你要是把圆括号里面的问号去掉匹配到的就是bobb了




"+"至少匹配一次和多次

line = 'aabbbbbaa'

model =".*(b.+b).*" 

result= re.match(model, line) 

print(result.group(1))#结果为bbb,如果改为model =".*?(b.+b).*"  结果为bbbbb



#“{数字}”前面字符串出现的次数

model=".*(b.{1}b).*"   #中间的字符只能出现一次 例如 能匹配到'bab'或'bcb',但不能匹配到'basb'或'basdsadb'

model=".*(b.{1,}b).*" #中间字符串能出现1次到多次,例如:能匹配到'bab'或'bcb',也能匹配到匹配到'basb'或'basdsadb'

model=".*(b.{1,3}b).*" #中间字符串最少1次最多3三次,例如'bab''baab''baaab'




#“|”或的意思

model="bobby|bobby123" #匹配bobby 或者bobby123

model="(boby|bobby)123" #匹配boby123 或者bobby123



“[]”括号是任意一个数进行匹配

例子1:

model="[abcd]obby123"

#上面这种模式智能匹配到'aobby123','bobby123','cobby123','dobby123'

例子2:

line = "17784667413" #对电话号码提取

model="1[48357][0-9]{9}"

#以1开头第二位数必须要是48357中的一位,[0-9]是匹配0到9之间的任意数字,{9}可以出现9次

#[^]括号里放尖括号就是反的意思

例如[^1]匹配到非1的字符

line = "17" 

model = "1[^7]"

y=re.match(model, line) 

print(y.group(0)) #输出none,因为line里面含有7,如果换成别的数字就是true



[]中括号里出现的‘.’‘*’不再是任意匹配了,而是匹配‘.’‘*’一个符号而已

‘ \s ’是代表空格的意思,‘ \S ’只要不是空格,任意字符都可以,只能匹配一个.

#line = "你 好"中间有一个空格

#regex_str="你\s好"  就能匹配到 “你 好”

#line = "你很好"中间有一个空格

#regex_str="你\S好"  就能匹配到 “你很好”


"\w"任意字符相当于[A-Za-z0-9_] ,“\W”非'\w'的都可以,例如可以匹配到空格.

当然也可以通过编码匹配汉字[\u4E00-\u9FA5]

#line = "你 好"#中间有一个空格

#model="([\u4E00-\u9FA5]+)" #输出为‘你’

#因为‘你好’中间有一个空格,所以只能匹配到一个汉字。 你

#line = "你好"#中间有一个空格

#model="([\u4E00-\u9FA5]+)"  #。结果为 你好



#"\d"是匹配数字 

#line = "xxx出生于2001年"

#regex_str=".*?(\d+)"  #。拿到数字 结果为2001



混合模式

把前面的内容进行集合,我们来匹配出生日期,但写法却很不一样,例如下面这几种类型:

#line = "xxx出生于2001年6月2日"

#line = "xxx出生于2001-6-2"

#line = "xxx出生于2001-06-2日"

#line = "xxx出生于2001-06"

model=".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}.|[月/-]$|\d{1,2}.|$|[月/-]\d{1,2}))" match_obje = re.match(model, line)

if match_obje:

    print(match_obje.group(1)) 

你可能感兴趣的:(Python正则表达式)