Python正则表达式

正则表达式

1.正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
2.本章节主要介绍Python中常用的正则表达式处理函数。
3.字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
4.在很多语言中都有正则表达式,比如javascript,PHP等等

正则表达式模式

1.模式字符串使用特殊的语法来表示一个正则表达式:
2.字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
3.多数字母和数字前加一个反斜杠时会拥有不同的含义。
4.标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
5.反斜杠本身需要使用反斜杠转义。
6.由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’/t’,等价于’//t’)匹配相应的特殊字符。
7.下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

.    匹配除 "\n" 之外的任何单个字符。如果要匹配包括 '\n' 在内的任何字符,可使用像 '[.\n]'或者'[\s\S]' 的模式。
\d    匹配一个数字字符。等价于 [0-9]。
\D     匹配一个非数字字符。等价于 [^0-9]。
\s    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S     匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w    匹配字母数字。等价于'[A-Za-z0-9_]'。
\W    匹配任何非字母数字。等价于 '[^A-Za-z0-9_]'。
\b    匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B    匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
^    匹配字符串的开头
$    匹配字符串的末尾。
[...]    用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]    不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*    匹配0个或多个的表达式。
re+    匹配1个或多个的表达式。
re?    匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}    
re{ n,}    精确匹配n个前面表达式。
re{ n, m}    匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b    匹配a或b
(re)    G匹配括号内的表达式,也表示一个组

一些常用的例子

[Pp]ython     匹配 "Python" 或 "python"
rub[ye]    匹配 "ruby" 或 "rube"
[aeiou]    匹配中括号内的任意一个字母
[0-9]    匹配任何数字。类似于 [0123456789]
[a-z]    匹配任何小写字母
[A-Z]    匹配任何大写字母
[a-zA-Z0-9]    匹配任何字母及数字
[^aeiou]    除了aeiou字母以外的所有字符
[^0-9]    匹配除了数字外的字符 

python re模块

1.Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
2.re 模块使 Python 语言拥有全部的正则表达式功能。
3.re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

re.match函数

re.match(pattern, string, flags=0) 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

>>> import re
>>> test = re.match('\d{3}','123chen')
>>> test.group()
'123'
>>> 
>>> print re.match('www','www.baidu.com')
<_sre.SRE_Match object at 0x0000000002F388B8>
>>> print re.match('www','www.baidu.com').group()
www
>>> print re.match('com','www.baidu.com')
None
>>> print re.match('com','www.baidu.com').group()

Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    print re.match('com','www.baidu.com').group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> 

re.search函数

re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配。
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.findall函数

re.findall(pattern, string, flags=0) 匹配整个字符串,并返回一个列表
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
findall函数没有group()方法,因为他返回的是个列表

>>> import re
>>> t = 'Hello Python I Love you'
>>> test = re.findall('\S+',t)
>>> test
['Hello', 'Python', 'I', 'Love', 'you']
>>> type(test)
<type 'list'>
>>> 

re.sub函数

re.sub(pattern, repl, string, max=0)
pattern 匹配的正则表达式
repl 要替换的字符串
string 要匹配的字符串
max=0 替换的次数,默认为0
返回的字符串是在字符串中用 RE 最左边不重复的匹配来替换。如果模式没有发现,字符将被没有改变地返回。
可选参数 count 是模式匹配后替换的最大次数;count 必须是非负整数。缺省值是 0 表示替换所有的匹配。

>>> import re
>>> phone = '2015-999-888# this is phone number'
>>> num1 = re.sub(r'#.*$',"",phone)
>>> num1
'2015-999-888'
>>> num2 = re.sub(r'\D',"",phone)
>>> num2
'2015999888'
>>> 

示例1:匹配一个手机号

# test.py
# conding:utf-8
import re
while True:
    phone = raw_input('please input a phone:')
    test = re.match('^1[358]\d{9}$', phone)
    if test:
        print '匹配正确,匹配到的是:%s' % test.group()
    else:
        print '匹配错误,您输入的是:%s' % phone

示例2:匹配一个时间

>>> import re
>>> t = '19:45:32'
>>> reg = re.compile(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$')
>>> time = reg.match(t).group()
>>> time
'19:45:32'
>>> 

试一试:尝试去匹配一个QQ邮箱
someone@qq.com

>>> import re
>>> reg_qqmail_list = ['789456123@qq.com','65464@qq.com','1231545@QQ.com','qqmail.com','www.baidu.com']
>>> reg = re.compile(r'[0-9a-zA-Z]+@(qq|QQ).com')
>>> qqmail = [x for x in reg_qqmail_list if reg.match(x)]
>>> qqmail
['789456123@qq.com', '65464@qq.com', '1231545@QQ.com']
>>> 

扩展:
pyquery
beautiful soup
xpath
lxml


热评文章