正则表达式:
*正则表示式(或RE)是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块实现。
-可以为想要匹配的相应字符串指定规则
-该字符串集可能包含英文语句、e-mail地址、命令或任何你想要的东西
-可以问诸如“这个字符串匹配该模式吗?”
-“在这个字符串中是否有部分匹配该模式呢?”
-你也可以使用re以各种方式来修改或分隔字符串
*正则表达式模式被编译成一系列的字节码,然后由用c编写的匹配引擎执行
*正则表达式语言相对小型和受限(功能有限)
-并非所有字符串处理都能用正则表达式完成
*字符匹配
-普通字符
-大多数字母和字符一般都会和自身匹配
-如正则表达式test会和字符串"test“完全匹配
-元字符
. ^ $ * + ? {} \ | ( )
=============================================================
.[]
-常用来指定一个字符集:[abc];[a-z]
-元字符在字符集中不起作用:【akm$】
-补集匹配不在区间范围内的字符:【^5】
范例:
>>> import re #在python中如果想使用正则表示式,需先导入re模块,re模块中有许多方法 #定义正则表达式其实就是定义一个字符串 :s = "abc" ,但这个没有任何意义 #通常定义表达式时要加一个r : s = r"abc" 来定义这个正则表达式的字符串 >>> s = r"abc" #这个可以理解为规则 >>> re.findall(s,'aaaaaaa') [] #re.findall方法将规则s比较字符串'aaaaaaa',因为没有abc,所以返回为空 >>> re.findall(s,'abcddabc') ['abc', 'abc'] #最原始的匹配,通过普通字符匹配到自身 >>> st = "top tip tqp twp tep" >>> s = r"top" >>> re.findall(s,st) ['top'] >>> s = r"t[oe]p" >>> re.findall(s,st) ['top', 'tep'] #【制定一个字符集】 t开头,p结尾,中间是o或e中的一个 >>> s = r"t[^oe]p" >>> re.findall(s,st) ['tip', 'tqp', 'twp'] 【^匹配不在区间范围内的字符】,取反
.^
-匹配行首。除非设置MULTILINE标志,它只是匹配字符串的开始,在MULTILINE模式里,它也可以直接匹配字符串中的每个换行。
>>> s = r'hello' >>> b = 'hello world,hello boy' >>> re.findall(s,b) ['hello', 'hello'] >>> s = r'^hello' >>> re.findall(s,b) ['hello'] >>> b = ' world,hello boy' >>> re.findall(s,b) [] 【^表示行首】
.$
-匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。
>>> s = r'boy$' >>> re.findall(s,b) ['boy']
#注意【】中出现元字符 元字符在字符集中不起作用
>>> t = r't[abc$]' #匹配以a 或b 或c 为结尾的字符串 >>> re.findall(t,'ta') ['ta'] >>> re.findall(t,'t$') ['t$'] #未生效 >>> t = 't[^ab]' >>> re.findall(t,'ab') [] #取反 >>> r = 't[abc^]' >>> re.findall(r,'t^') ['t^']
更多用法:匹配一个范围,写法[0-9]、[a-zA-Z]\[a-zA-Z0-9]
>>> s = r'x[0123456789]x' >>> l = 'x1x x22x xxx' >>> re.findall(s,l) ['x1x'] >>> s = r'x[0-9]x' >>> re.findall(s,l) ['x1x']
.\转义字符
-反斜杠后面可以加不同的字符以表示不同特殊意义
-也可以用于取消所有的元字符:\[ 或\\
\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_]
范例:
>>> s = r'x\dx' >>> l = 'x1x x22x xxx' >>> re.findall(s,l) ['x1x'] #如有多次重复可以使用{次数} >>> r=r"010-\d\d\d\d\d\d\d\d" >>> re.findall(r,'010-87568745') ['010-87568745'] >>> r=r"010-\d{8}" >>> re.findall(r,'010-87568745') ['010-87568745'] >>> re.findall(r,'010-8756874') []
.重复 {次数}
-正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是你可以指定正则表达式的一部分的重复次数
>>> import re >>> s =r'^010-\d{8}' >>> re.findall(s,'010-36854625') ['010-36854625']
.*
-指定前一个字符可以被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围,20亿)
>>> a=r'ab*' >>> re.findall(a,'abbbbbb') ['abbbbbb'] >>> re.findall(a,'a') ['a']
.+
-表示匹配一次或更多次
-注意*和+之间的不同;*零次到多次。+至少一次;
>>> a=r'ab+' >>> re.findall(a,'accccccccb') [] >>> re.findall(a,'accccccccbab') ['ab']
.?
-表示将前一个符号重复0次或1次
#用于表示某事物是可选的。
>>> s=r'^010-?\d{8}$' >>> re.findall(s,'010-12345678') ['010-12345678'] >>> re.findall(s,'01012345678') ['01012345678'] >>> re.findall(s,'01012345678abc') #此处同时需要注意$的使用
.+?
-最小匹配模式
>>> s=r'ab' >>> re.findall(s,'abbbbababb') ['ab', 'ab', 'ab']
.{m,n}
-其中m和n是十进制整数。该限定符的意思是至少有m个重复,至多到n次重复。
>>> s=r'ab' >>> re.findall(b,'abbbbbababb') ['abbb', 'ab', 'abb']
-忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
-{0,}等同于*,{1,}等同于+,而{0,1}则与?相同
>>> s=r'ab{1,}' >>> d=r'ab+' >>> re.findall(s,'abbbbababb') ['abbbb', 'ab', 'abb'] >>> re.findall(d,'abbbbababb') ['abbbb', 'ab', 'abb']
. | 或 () 分组
范例:
>>> import re >>> email = r'\w{3,8}@(\.com|\.cn|\.org)' #注意.需要转义 >>> re.match(email,'kong@.com') <_sre.SRE_Match object at 0x7f4de058ff30> >>> re.match(email,'kong@.xinnet') >>> re.match(email,'kong@.org') <_sre.SRE_Match object at 0x7f4de058feb8> >>> re.findall(email,'kong@.org') #findall可以返回分组的数据,这是它的一个特性 ['.org']