标签:
就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,
(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被
编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
>>> s = "this is myblogs ,1 2 ,34" >>> re.findall(‘is‘,s) [‘is‘, ‘is‘] >>> re.findall(‘2‘,s) [‘2‘]
二元字符匹配
常用元字符:
-,非
^,"" 里面的特殊符号没有任何意义
具体使用:
>>> s = "this is myblogs , my name is blogs" # . 表示任意字符,通用匹配 >>> re.findall(‘.s‘,s) #使用.匹配任意以s结尾的两位字符串 [‘is‘, ‘is‘, ‘gs‘, ‘is‘, ‘gs‘] >>> re.findall(‘.blogs‘,s) [‘yblogs‘, ‘ blogs‘] >>> re.findall(‘b.og‘,s) [‘blog‘, ‘blog‘] # ^ 表示匹配开头,只匹配开头内容 >>> re.findall(‘^is‘,s) [] >>> re.findall(‘^th‘,s) [‘th‘] >>> re.findall(‘^this‘,s) [‘this‘] # $表示匹配结尾内容,只匹配结尾,用在字符之后 >>> re.findall(‘$s‘,s) #注意$要放字符串后边 [] >>> re.findall(‘s$‘,s) [‘s‘] >>> re.findall(‘.s$‘,s) [‘gs‘] # *表示匹配前面字符0到多次,用在字符之后,只针对前面的一个字符 >>> s = "aabbccddabcdabcd" >>> re.findall(‘a*‘,s) #匹配0到多次,所以会打印没有匹配到的 [‘aa‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘a‘, ‘‘, ‘‘, ‘‘, ‘a‘, ‘‘, ‘‘, ‘‘, ‘‘] >>> re.findall(‘aa*‘,s) #匹配第二个a出现的0到多次 [‘aa‘, ‘a‘, ‘a‘] >>> re.findall(‘ab*‘,s) #匹配b出现的0到多次 [‘a‘, ‘abb‘, ‘ab‘, ‘ab‘] # + 匹配前面的字符1到多次,最少有一个 >>> re.findall(‘a+‘,s) #最少出现一个a [‘aa‘, ‘a‘, ‘a‘] >>> re.findall(‘aa+‘,s) #最少出现一个aa [‘aa‘] >>> re.findall(‘ab+‘,s) #最少出现一个ab [‘abb‘, ‘ab‘, ‘ab‘] # ? 匹配前面的字符0-1次,只能出现一次或没有 >>> s = "aa bb cc dd abcd ababcdcd" >>> re.findall(‘aa?‘,s) [‘aa‘, ‘a‘, ‘a‘, ‘a‘] >>> re.findall(‘ab?‘,s) [‘a‘, ‘a‘, ‘ab‘, ‘ab‘, ‘ab‘] #匹配出现一次b或者没有,所结果中b只能出现一次或者没有 # / 转义功能,去除后面字符的特殊意义 >>> s = "* *? +> <>" >>> re.findall(‘^\*‘,s) #匹配*号 [‘*‘] >>> re.findall(‘\*.‘,s) [‘* ‘, ‘*?‘] #{} 指定匹配次数 s = "aa bb aaa bbb aabbcc aaabbb abab ababab" >>> re.findall(‘a{1,2}‘,s) #匹配a出现的1-2次,即a aa [‘aa‘, ‘aa‘, ‘a‘, ‘aa‘, ‘aa‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘, ‘a‘] >>> re.findall(‘ab{1,2}‘,s) #匹配ab或 abb [‘abb‘, ‘abb‘, ‘ab‘, ‘ab‘, ‘ab‘, ‘ab‘, ‘ab‘] # [] 或的作用 >>> s = "abc adc aec adec abbc addc abbbc adddc ac abbddc" >>> re.findall(‘a[db]c‘,s) #匹配abc 或adc [‘abc‘, ‘adc‘] >>> re.findall(‘a[db]+c‘,s) #匹配ac中间至少1个b或d,可以有多个 [‘abc‘, ‘adc‘, ‘abbc‘, ‘addc‘, ‘abbbc‘, ‘adddc‘, ‘abbddc‘] >>> re.findall(‘a[db]?c‘,s) #匹配ac中间一个a或b,可以没有 [‘abc‘, ‘adc‘, ‘ac‘] >>> re.findall(‘a[db]*c‘,s) #匹配ac中间0到多个b或d [‘abc‘, ‘adc‘, ‘abbc‘, ‘addc‘, ‘abbbc‘, ‘adddc‘, ‘ac‘, ‘abbddc‘] >>> re.findall(‘a[^db]c‘,s) #匹配ac中间不出现b或d的情况 ^在这里表示非 [‘aec‘] >>> s = "abc abbbbbc a1231c a_+_+_+_+_+_c " >>> re.findall(‘a[a-z,0-9]+c‘,s) #匹配ac中间是字母或数字 [‘abc‘, ‘abbbbbc‘, ‘a1231c‘]
其他特殊意义的字符加字母:
never中的 ‘er‘,但不能匹配
verb中的 ‘er‘。
verb中的 ‘er‘,但不能匹配
never中的 ‘er‘。
具体实例:
>>> s = "1234 abcd ABCD _ * <>" >>> re.findall(‘\\w‘,s) [‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘_‘] >>> re.findall(‘\\W‘,s) [‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘*‘, ‘ ‘, ‘<‘, ‘>‘] >>> re.findall(‘\\s‘,s) [‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘] >>> re.findall(‘\\S‘,s) [‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘_‘, ‘*‘, ‘<‘, ‘>‘] >>> re.findall(‘\\d‘,s) [‘1‘, ‘2‘, ‘3‘, ‘4‘] >>> re.findall(‘\\D‘,s) [‘ ‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘ ‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘ ‘, ‘_‘, ‘ ‘, ‘*‘, ‘ ‘, ‘<‘, ‘>‘] >>> re.findall(‘\\A‘,s) [‘‘] >>> re.findall(‘\\A1‘,s) [‘1‘] >>> re.findall(‘\\A2‘,s) [] >>> re.findall(‘\\Z\>‘,s) [] >>> re.findall(‘\>\\Z‘,s) [‘>‘]
PS:
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符
",那么使用编程语言表示的正则表达式里将需要4个反斜杠\\
:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r\
表示。同样,匹配一个数字的\d
可以写成r\d
。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
所谓原生字符串就是python解释器不在解释规则在python中的含义,而是直接交给re模块来处理
分组匹配一般使用(),被括起来的表达式将作为一组,上面所说的只是针对单个字符串,如果需要匹配多个字符串,则用到了分组匹配。先匹配成功全部正则,再匹配成功的局部内容提取出来
如下:
>>> s = "aa bb aaa bbb aabbcc aaabbb abab ababab" >>> re.findall(‘(ab).‘,s) #同时匹配ab [‘ab‘, ‘ab‘, ‘ab‘, ‘ab‘]
下面将在re模块常用函数中来说明
注意:
findall如果使用了分组,则输出的内容将是分组中的内容而非find到的结果,
为了得到find到的结果,要加上问号来启用“不捕捉模式”,就可以了。
>>> re.findall("www.(baidu|xinlang)\.com","www.baidu.com") [‘baidu‘] >>> re.findall("www.(?:baidu|xinlang)\.com","www.baidu.com") [‘www.baidu.com‘]
>>> s = ‘123abc4545‘ >>> re.match(r‘\w‘,s) <_sre.SRE_Match object; span=(0, 1), match=‘1‘> >>> re.match(r‘\w‘,s).group() 只匹配字符串开头 ‘1‘
>>> s = ‘123abc4545‘ >>> re.search(r‘\w‘,s) <_sre.SRE_Match object; span=(0, 1), match=‘1‘> >>> re.search(r‘\w‘,s).group() ‘1‘ >>> re.search(r‘\D‘,s).group() ‘a‘
PS:以上match和search都返回的是对象,其返回的对象有以下属性和方法:
属性:
方法:
举例:
>>> a = "123abc456" >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a) <_sre.SRE_Match object; span=(0, 9), match=‘123abc456‘> >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a).group() ‘123abc456‘ >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) ‘123abc456‘ >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) ‘123‘ >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) ‘abc‘ >>> re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3) ‘456‘
# group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3)
列出第三个括号匹配部分。
其他函数
>>> s = "a1b2c3" >>> re.split(‘\d‘,s) [‘a‘, ‘b‘, ‘c‘, ‘‘] #注意后面的空字符串,因为最后一个是数字,所以后边就多一个空字符
>>> s = "a1b2c3" >>> re.sub(‘\d‘,‘-‘,s) ‘a-b-c-‘
>>> a = re.compile(‘\d‘) >>> s = "a1b2c3" >>> a.findall(s) [‘1‘, ‘2‘, ‘3‘]
>>> a = re.compile(‘\d‘) >>> s = "a1b2c3" >>>for m in a.finditer(s):print(m.group()) ... 1 2 3
>>> s = "my name is jeck, my phone is 18611112222, my email is jeck@gmail.com,my ip is 10.20.10.20,,my ID card is 110521199012256515" >>> re.findall(‘(1[3578]\d{9})‘,s) [‘18611112222‘] >>> re.search(‘(1[3578]\d{9})‘,s).group() ‘18611112222‘ >>> re.search(‘(13[0-9]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}‘,s).group() ‘18611112222‘
s = "my name is jeck, my phone is 18611112222, my email is jeck@gmail.com,my ip is 10.20.10.20,,my ID card is 110521199012256515" >>> re.search("([1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$)",s).group() ‘110521199012256515‘
s = "my name is jeck, my phone is 18611112222, my email is jeck@gmail.com,my ip is 10.20.10.20,,my ID card is 110521199012256515" >>> re.search(‘\d+\.\d+\.\d+\.\d+‘,s).group() ‘10.20.10.20‘ >>> re.search(‘\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}‘,s).group() ‘10.20.10.20‘
>>>s = "my name is jeck, my phone is 18611112222, my email is jeck@gmail.com,my ip is 10.20.10.20,,my ID card is 110521199012256515" >>>re.search(‘([a-zA-Z0-9._%+-])+@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})‘,s).group() ‘jeck@gmail.com‘
标签:
原文地址:http://www.cnblogs.com/pycode/p/re.html