Python模块_re正则表达式模块

正则表达式(re)是一种小型,调试专业化的编程语言

为什么专业,因为它只对字符串进行操作,正则表达式被编译成一系列的字节码,然后用C编写的匹配引擎执行,效率很高!

 

 

字符匹配: 普通字符,元字符


 普通字符:大多数字符都会和自身匹配

import re
print(re.findall("James","aaaJamesaaa")) #结果是:['James'],我管这个叫绝对匹配,除了\n不能匹配,其它都可以

 

 


•元字符:在re有特殊意义的字符    . ^ $ * + ? {} [] | () \

print(re.findall("\n","ab ac ad ae \n")) #\n能匹配出来呢?为什么说\匹配不出来?

 

元字符之 .(点) 代表单个任意字符

print(re.findall("A..B","A-=B-C-D-E")) #2个点,只要A和B之前有2个任意的字符都能匹配到结果,结果是:['A-=B']

 

元字符之 ^(尖角号)代表开头的字符,必须放在条件的开头

print(re.findall("^B-C","A-=B-C-D-E")) #匹配结果是:[] , 空的列表,不是我们想要的结果
print(re.findall("^B-C","B-C-D-E")) #结果是:['B-C'] ,是我们想要的结果

 

 元字符之 $(dollar)代表结尾的字符,必须放在条件的末尾

print(re.findall("-E$","A-B-C-D-E-")) #结果是:[],空的列表
print(re.findall("-E$","A-B-C-D-E-")) #结果是:['-E'],匹配成功

 

 #


 元字符之 *(星)代表字符出现的次数是 0次到无穷次{0,+∞}(贪婪匹配,有多少拿多少)

print(re.findall("BC*","AB_absssss")) # 即使C没有出现过(也就是出现为0次),也能匹配到,结果是:['B']
print(re.findall("BC*","ABCCCCC_absssss")) #贪婪匹配,C有多少取多少,结果是:['BCCCCC']

 

 元字符之 +(加号)代表字符出现的次数是 1次到无穷次{1,+∞}(贪婪匹配,有多少拿多少)

print(re.findall("BC+","AB_absssss")) # C没有出现过(也就是出现为0次),匹配不到,结果是:[] ,空的列表,匹配失败
print(re.findall("BC+","ABCCCCC_absssss")) #贪婪匹配,C有多少取多少,结果是:['BCCCCC'] ,匹配成功

 

 元字符之 ?(问号)代表字符出现的次数是 0次或者1次{0,1}

print(re.findall("BC?","AB_absssss")) #结果是:['B'] ,出现的次数是0次,匹配成功
print(re.findall("BC?","ABCC_absssss")) #结果是:['B'] ,出现的次数是1次,匹配成功

 

#


 元字符之 {} 花括号 代表...要填参数的

{0,} 代表 字符出现的次数是 0次到无穷次,相当于 *(星)

print(re.findall("BC{0,}","ABCCCCCCCCCCC_absssss")) 

 

{1,} 代表 字符出现的次数是 1次到无穷次,相当于 +(加号)

print(re.findall("BC{1,}","ABCCCCCCCCCCC_absssss"))

 

{0,1} 代表 字符出现的次数是 0次或者1次,相当于 ?(问号) 

print(re.findall("BC{0,1}","AB_absssss")) #结果是:['B'] ,出现的次数是0次,匹配成功

 

{5} 代表 字符出现的次数是 5次

print(re.findall("BC{5}","ABCCCCCCCCCCC_absssss")) #结果是:['BCCCCC'],出现的次数是5次,匹配成功

 

{0,5} 代表 字符出现的次数是 0次到5次

print(re.findall("BC{0,5}","AB_absssss")) #结果是:['B'],出现的次数是0次,匹配成功

 

#


前面的 * + ? 都属于贪婪匹配,有多少拿多少,如果在这些后面再加上一个 ?(问号),就变成了 最小匹配(拿最小条件后就结束)

print(re.findall("BC{0,5}?","ABCCCCC_absssss")) #结果是:['B'],C出现的次数为 0到5次,0次是最小匹配,匹配成功

 

#


元字符之  [ ] 中括号 代表 匹配中括号中的单个字符

print(re.findall("B[ACBD]","ABCCCCBC_absssss")) #结果是:['BC', 'BC'],[]里匹配的是单个字符,匹配成功2次

 

元字符之  [ ] 中括号 代表 匹配中括号中的单个字符,组合 *(星),特别的有 [0-9] [a-z] [A-Z]

print(re.findall("A[a-z]*","aaaaaaaaaA3344")) #结果是:['A']
print(re.findall("A[0-9]*","aaaaaaaaaA3344")) #结果是:['A3344']

 

元字符之  [ ] 中括号 代表 匹配中括号中的单个字符,特别的有 [^0-9] [^a-z] [^A-Z] [^abc] [^123],这里的 ^ 指的是 非 就是not的意思

print(re.findall("A[a-z]*","aaaaaaaaaA3344")) #结果是:['A']
print(re.findall("A[^a-z]*","aaaaaaaaaA3344")) #结果是:['A3344']
print(re.findall("A[0-9]*","aaaaaaaaaA3344")) #结果是:['A3344']

 

元字符之 \ (反斜杆) 代表着 \ 的意思是 转义字符 

\ (反斜杆)后面跟着 元字符,能去除元字符的特殊功能,比如 \.(反斜杆 点),让其 .(点)的原来功能:代表单个任意字符的这个功能 给去除掉,就是单纯的 . 无功能

\ (反斜杆)后面跟着 普通字符,能实现 特殊功能,比如 \d

  • \d 匹配任何十进制数;相当于[0-9]
  • \D 匹配任何非数字字符;相当于[^0-9]
  • \s 匹配任何空白字符;相当于[\t\n\r\f\v]
  • \S 匹配任何非空白字符;相当于[^\t\n\r\f\v]
  • \w 匹配任何字母及数字字符;相当于[a-zA-Z0-9_]
  • \W 匹配任何非字母及数字字符;相当于[^a-zA-Z0-9_]
  • \b 匹配一个特殊字符边界,比如 空格 & # 等等

 

 

#


 题目:算数题 12+(34*6+2-5*(2-1)),用re正则拿到最里层的括号的内容

先看看下面这个的结果

print(re.findall("[A-Z]\([12]+","A(1+1)+B(2+1)+C(12+1)+D(1212+1)+E(1122+1)+F(2211+1)")) #结果是:['A(1', 'B(2', 'C(12', 'D(1212', 'E(1122', 'F(2211']

 \([12]+ 代表什么呢, 代表 (后的1出现一次或者无穷, 代表 (后的2出现一次或者无穷,代表 (后的1出现后,下一个字符是2或者1都可以,代表 (后的2出现后,下一个字符是1或者是2都可以,一直匹配到无结果为结束 

 

+代表匹配1次或者多次,但是[]原先是只匹配单个字符的,和+配合就形成了可以匹配[]里的多个字符

print(re.findall("[A-Z]\([1b]+","A(12345,A(bcdef,A(b11b1bb1,A(1bb1b111")) #结果是:['A(1', 'A(b', 'A(b11b1bb1', 'A(1bb1b111']

A(12345出来的匹配结果是:A(1  ,因为1后面既不是1,也不是b,所以匹配结束,继续下一次匹配

A(bcdef出来的匹配结果是: A(b  ,因为b后面既不是1,也不是b,所以匹配结束,继续下一次匹配

后面2个结果都能完成的出现,因为A(后面的1和b没有中断,符合[1b]中的(要么是1或者要么是b)出现的次数为1次或者无穷次的这个条件

 

解题思路:拿到字符串"12+(34*6+2-5*(2-1))"最里层的()里的内容,也就是说()里没有()就意味是最里层的()了

print(re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))")),#结果是:['(2-1)'],
print(re.findall("[^(]+[^)]","(2-1)")) #再把 ['(2-1)']的小括号给去掉,结果是:['2-1'],答案出来了

 

posted on 2019-07-18 15:09  詹生  阅读(234)  评论(0编辑  收藏  举报

导航