一、定义
正则表达式是一个特殊的字符序列,可以检测一个字符串是否与设定的字符序列相匹配。可以实现文本字符快速检索、替换等功能。
import re a = "C|C++|Java|C#|Python|Javascript|Python" #已有以下两种方式判断某字符串是否在指定文本中 print(a.index("Python") > -1) print("Python" in a)#以下为正则表达式最基本的方法findall,只是参数设为常数 r = re.findall("Python", a) if len(r) != 0:print("字符串a中包含Python")print(r) else:print("Not exit!")
二、元字符与普通字符
普通字符即是a-z,0-9,A-Z,标点符号这些所有的非元字符。
元字符是指特定指代某些特殊含义的字符。如/d匹配一个数字字符,等价于[0-9];/D匹配一个非数字字符,等价于[^0-9];\n匹配一个换行符;\s匹配任意的不可见字符,包括空格、制表符、换页符等;\S匹配任意的课件字符;[a-z]、[A-Z]匹配指定范围内的任意字符;\b匹配一个单词边界,即指单词和空格之间的位置,如“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的"er";\B匹配一个非单词边界.....等等。
import re a = "C0C++7Java8C+9Python6Javascript"#提取a中的数字,参数设为表示0~9的正则表达式 #\d即为元字符,表示数字 r = re.findall("\d", a) print(r)#提取a中的非数字 r1 = re.findall("\D", a) print(r1)
三、字符集
出现在字符集中的字符之间是“或”的关系,即均可匹配,如[cf],既匹配c也匹配f。
#字符集import re s = "abc, acc, adc, aec, afc, ahc"#找出中间一个字符是c或者f的字符串/单词 #通过普通字符a\c定界 #再通过字符集设定我们的需求 r1 = re.findall("a[cf]c", s)#匹配中间字符非c非f非d的字符串/单词 r2 = re.findall("a[^cfd]c", s)#匹配中间字符为一段字符中任一字符的字符串/单词 r3 = re.findall("a[c-f]c", s)print(r1) print(r2) print(r3)
import res = "python@11 11\tjava&67\n8__php\rC++"#匹配字符串中的所有数字 r1 = re.findall("\d", s) #也可以如下明确的字符集方式 r2 = re.findall("[\d]", s) #也可以如下: r3 = re.findall("[0-9]", s) r4 = re.findall("[^\D]", s)print(r1) print(r2) print(r3) print(r4) #如要匹配字符串中所有数字和字母 #可以用\w,该元字符表示数字和字母和下划线,即只能匹配单词字符 r5 = re.findall("\w", s) #也可以如下 r6 = re.findall("[0-9a-zA-Z_]", s)print(r5) print(r6)#非单词字符则是用\W来匹配 r7 = re.findall("\W", s) print(r7) #空格、制表符、换行等称为空白字符,可用\s表示 r8 = re.findall("\s", s) print(r8)
四、数量词
#数量词 import rea = "python 1111java678php"r1 = re.findall("[a-zA-Z]", a) #但这样只能匹配到单个字符 print(r1) #如何按单词的方式去匹配呢 #可以在匹配组合后面加上数量,这就称为数量词 r2 = re.findall("[a-zA-Z]{3}", a) print(r2) #而且数量词可设为一个区间 r3 = re.findall("[a-zA-Z]{3,6}", a) print(r3)
数量词的匹配模式:贪婪与不贪婪
贪婪即是指:如上代码对于[a-zA-Z]{3,6}这样的正则表达式,匹配字符串a时,因为设置的匹配数量是3到6,当匹配到"pyt"时已经满足正则表达式的要求了,这时候是输出呢还是继续匹配呢?
python中默认是继续匹配——即贪婪模式,直到匹配不到,或者已经超出设置的数量范围才输出。贪婪即要匹配更多...
如要设置为非贪婪模式,则在数量词后面加?即可:
import rea = "python 1111java678php"#默认为贪婪匹配模式 r3 = re.findall("[a-zA-Z]{3,6}", a) print(r3)#非贪婪模式 r4 = re.findall("[a-zA-Z]{3,6}?", a) print(r4)
其实非贪婪模式下的{3,6}?与{3}作用类似。
除了上述的方式,数量词还有用*表示匹配*前面的字符0次或者无限多次;+匹配+前面的字符1次或者无限多次;?匹配?前面的字符0次或者1次。
#数量词 import rea = "pytho0python1pythonn2" b = "pyth111pythoner333pythonnnn555"#*匹配0次或无限多次 #具体就是对*前面一个字符"n"可以出现0次或者无限次 r1 = re.findall("python*", a) r2 = re.findall("python*", b) print(r1) print(r2)#+是匹配1次或无限多次 r3 = re.findall("python+", a) print(r3)#?是匹配0次或者1次 #此时也涉及当即可以匹配0次又可以匹配1次的时候,默认是匹配1次 r4 = re.findall("python?", a) print(r4)#组合用法 r5 = re.findall("python{1,2}", a) print(r5)
五、边界匹配、组、匹配模式参数
#边界匹配 import re QQ_number = "100000001" #验证是否为QQ号码,默认QQ号码为4~8位 #^表示从字符串第一个字符开始匹配 #$表示从字符串最后一个或几个字符也得匹配 r = re.findall("^\d{4,8}$", QQ_number) print(r) if r !=[]:print("是QQ号码!") else:print("不是QQ号码!")
#组 import re a = "PythonPythonPythonPythonPython"#要求判断a中是否包含3个python #需要成组的字符用()组合 #要注意[]里的字符是或的关系,()里的字符是且的关系,即组合。 r1 = re.findall("(Python){3}", a) print(r1)
#匹配模式参数 import relanguage = "PythonC#\nJavaPHP" #第三个参数即为模式参数 #设为re.I为忽略字母大小写 r = re.findall("c#", language, re.I) print(r) #设为re.S 为设置"."匹配所有字符(含换行符) r1 = re.findall("C#.{1}", language, re.S) print(r1) #也可以组合使用,|是且的关系 r2 = re.findall("c#.{1}", language, re.I | re.S) print(r2)