正则表达式中的一些符号:
" . "是可以匹配到任意一个字符.
" * "可以匹配到前面字符的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))