构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。
字符 | 描述 |
---|---|
[ABC] | 匹配[...]中的所有字符 |
[a-z] | 匹配范围内字符 |
\w | 字母、数字、下划线 |
\d | 任意阿拉伯数字 |
\f | 换页符 |
\r | 回车符 |
\n | 换行符 |
\s | 任何空白字符串 |
\S | 任何非空白字符串 |
\t | 制表符 |
\v | 垂直制表符 |
字符 | 描述 |
---|---|
^ | 匹配开头 |
$ | 匹配结尾 |
() | 表笔表达式 |
. | 除换行符\n以外的任何字符 |
* | 匹配前面的子表达式 0次或多次 |
+ | 匹配前面的子表达式 1次或多次 |
? | 匹配前面的子表达式 0次或一次 或指明一个非贪婪限定符 |
{n,m} | 匹配前面的子表达式 n次或m次 |
i | 不区分大小写 |
g | 全局匹配 |
m | 多行匹配,使边界字符^$匹配每一行的开头和结尾 |
s | 使特殊字符.中包含换行符\n |
- 贪婪匹配: *和+限定符都是贪婪的,会尽量多的匹配文字
/<.*>/
<h1>123qwe</h1>
会匹配整个字符串
- 非贪婪匹配 在贪婪限定符后面加上一个?可以实现最小匹配
/<.*?>/
<h1>123qwe</h1>
只匹配字符串 <h1>
re.match(pattern, string, flags=0)
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
--------------
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
re.search(pattern, string, flags=0)
用法与match类似,区别是:
- re.match只匹配字符串带开始,若字符串开始不符合,则匹配失败
- re.search匹配整个字符串,直到找到一个匹配
re.compile(pattern[, flags])
-
pattern : 一个字符串形式的正则表达式
-
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I 忽略大小写 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 re.M 多行模式 re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换 行符) re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库 re.X 为了增加可读性,忽略空格和 # 后面的注释
返回正则表达式对象,可供match、search使用。也可配合findall使用。
s="<body><h1>BeiJing2008</h1></body>"
com=re.compile("<body><h1>.*?</h1></body>")
com=re.compile("<body><h1>(.*?)</h1></body>")
--------------
['BeiJing2008']
['<body><h1>BeiJing2008</h1></body>']