爬虫之正则表达式基础篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/86352526

一 点睛

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)等来获取。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/86352526