三、正则表达式
1.实例引入
打开开源中国提供的正则表达式测试工具 http://tool.oschina.net/regex/ ,输入待匹配的文本,然后选择常用的正则表达式,就可以得出相应的匹配结果。
对于URL来说,可以用下面的正则表达式匹配:
[a-zA-z]+://[^\s]*
用这个正则表达式去匹配一个字符串,如果这个字符串中包含类似URL的文本,那就会被提取出来。
常用的匹配规则:
模式 | 描述 |
---|---|
\w | 匹配字母、数字及下划线 |
\W | 匹配不是字母、数字及下划线 |
\s | 匹配任意空白字符,等价于[\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字的字符 |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结尾,如果存在换行,同时还会匹配换行符 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配一行字符串的开头 |
$ | 匹配一行字符串的结尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出,比如[amk]匹配a、m或k |
[ ^… ] | 不在[]中的字符,比如[ ^abc ]匹配除了a、b、c之外的字符 |
* | 匹配0个或多个表达式 |
+ | 匹配1个或多个表达式 |
? | 匹配0个或1个前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配n个前面的表达式 |
{n,m} | 匹配n到m次由前面正则表达式的片段,贪婪方式 |
a | b |
() | 匹配括号内的表达式,也表示一个组 |
2.match()
match(),向它传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否匹配字符串。
match()方法尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配就会返回None。示例如下:
import re
content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
print(result.group())
print(result.span())
运行结果:
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
这里首先声明了一个字符串,其中包含英文字母、空白字符、数学等,然后写谢了一个正则表达式,用它来匹配这个长字符串。开头的^ 是匹配字符串的开头,也就是以Hello开头;然后\s匹配空白字符,用来匹配目标字符串的空格;\d匹配数字,3个\d匹配123;然后再写1个\s匹配空格;后面还有4567,可以写4个\d来匹配,但这样写太繁琐,所以后面可以跟{4}以代表匹配前面的规则4次,也就是匹配4个数字;然后后面再紧接1个空白字符,最后\w{10}匹配10个字母及下划线。这里其实并没有把目标字符串匹配玩,不过这样易燃可以进行匹配,只不过匹配结果短一点而已。
而在match()方法中,第一个参数传入了正则表达式,第二个参数传入了要匹配的字符串。
根据输出结果,可以看到结果是SRE_Match对象,这证明成功匹配。该对象有两个方法:group()方法可以输出匹配到的内容,结果是Hello 123 4567 Word_This,这恰好是正则表达式所匹配的内容;span()方法可以输出匹配的范围,结果是(0,25),这就是匹配到的结果字符串在原字符串中的位置范围。