一 点睛
1 正则表达式工具
http://tool.oschina.net/regex/
2 测试一下
Hello, my phone number is 029-86432100 and email is 798103175@qq.com.com, and CSDN website is http://cddn.com.
3 说明
其实,这里就是用了正则表达式匹配,也就是用一定的规则将特定的文本提取出来。比如,电子邮件开头是一段字符串,然后是一个@符号,最后是某个域名,这是有特定的组成格式的。
二 常用的匹配规则
模式 | 描述 |
\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 | 匹配a或b |
( ) | 匹配括号内的表达式,也表示一个组 |
Python的re库提供了整个正则表达式的实现,利用这个库,可以在Python中使用正则表达式。在Python中写正则表达式几乎都用这个库。
三 match()的使用
1 点睛
向match传入要匹配的字符串以及正则表达式,就可以检测这个正则表达式是否匹配字符串。该方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果;如果不匹配,就返回None。
2 基本用法
2.1 代码
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())
2,2 运行结果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_3.py
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
2.3 说明
正则表达式开头的^是匹配字符串的开头,也就是以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 World_This,这恰好是正则表达式规则所匹配的内容;span()方法可以输出匹配的范围,结果是(0, 25),这就是匹配到的结果字符串在原字符串中的位置范围。
3 匹配目标
3.1 代码
# 使用()括号将想提取的子字符串括起来。
# ()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,
# 调用group()方法传入分组的索引即可获取提取的结果。
import re
content = 'Hello 1234567 World_This is a Regex Demo'
# 这里我们想把字符串中的1234567提取出来,此时可以将数字部分的正则表达式用()括起来
# ,然后调用了group(1)获取匹配结果。
result = re.match('^Hello\s(\d+)\sWorld', content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())
3.2 运行结果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_3.py
41
<_sre.SRE_Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)
<_sre.SRE_Match object; span=(0, 19), match='Hello 1234567 World'>
Hello 1234567 World
1234567
(0, 19)
3.3 说明
可以看到,我们成功得到了1234567。这里用的是group(1),它与group()有所不同,后者会输出完整的匹配结果,而前者会输出第一个被()包围的匹配结果。假如正则表达式后面还有()包括的内容,那么可以依次用group(2)、group(3)等来获取。