Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3

Python网络爬虫与信息提取(基础篇三)

    • Re(正则表达式)库入门
        • 正则表达式的概念
        • 正则表达式的语法
        • Re库的基本使用
        • Re库的match对象
        • Re库的贪婪匹配和最小匹配

Re(正则表达式)库入门

正则表达式的概念

正则表达式:regular expression 也叫regex, RE

  • 用来简洁表达一组字符串的表达式
  • 通用的字符串表达框架
  • 判断某字符串的特征归属

‘PN’
‘PYN’
‘PYTN’
‘PYTHN’
‘PYTHON’

正则表达式:
P(Y|YT|YTH|YTHO)?N

‘PY’
‘PYY’
‘PYYY’
‘PYYYY’

‘PYYYYY…’

正则表达式:
PY+

‘PY’开头
后续存在不多于10个字符
后续字符不能是’P’或’Y’

正则表达式:PY[^PY]{0,10}

在文本处理中:

  • 表达文本类型的特征
  • 同时查找或替换一组字符串
  • 匹配字符串的全部或部分

使用:

编译:将符合正则表达式语法的字符串转换成正则表达式特征
regex=‘P(Y|YT|YTH|YTHO)?N’
p=re.compile(regex)

正则表达式的语法

正则表达式由字符和操作符构成

操作符 说明 实例
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围 [abc]表示a,b,c,[a-z]表示a到z单个字符
[^] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc*表示ab,abc,abcc,abccc等
+ 前一个字符1次或无限次扩展 abc+表示abc,abcc,abccc等
? 前一个字符0次或1次扩展 abc?表示ab,abc
| 左右表达式任意一个 abc|def表示abc,def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m,n} 扩展前一个字符m至n次 ab{1,2}c表示abc,abbc
^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
() 分组标记,内部只能使用 | 操作符 (abc)表示abc, (abc|def)表示abc,def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9_]
实例 说明
^[A-Za-z]+$ 由26个字母组成的字符串
^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串
^-?\d+$ 整数形式的字符串
^[0-9]* [1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 中国境内邮政编码,6位
[\u4e00-\u9fa5] 匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7} 国内电话号码,010-68913536

匹配IP地址的正则表达式:
IP地址字符串形式的正则表达式(IP地址分4段,每段0~255)

0-99: [1-9]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-255: 25[0-5]
(([1-9]?\d | 1\d{2} | 2[0-4]\d | 25[0-5]).){3}([1-9]?\d | 1\d{2} | 2[0-4]\d | 25[0-5])

Re库的基本使用

正则表达式的表示类型:

  • raw string类型(原生字符串类型)
    re库采用raw string类型表示正则表达式,表示为 r’text’
    例如:r’[1-9]\d{5}’
    raw string是不包含转义符的字符串
  • string类型,更繁琐

Re库主要功能函数

函数 说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第1张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第2张图片

>>> import re
>>> match=re.search(r'[1-9]\d{5}','BIT 100081')
>>> if match:
...    print(match.group(0))
...
100081

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第3张图片

>>> import re
>>> match=re.match(r'[1-9]\d{5}','100081 BIT')
#match函数从字符串的开头进行匹配
>>> if match:
...    print(match.group(0))
...
100081

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第4张图片

>>> import re
>>> ls=re.findall(r'[1-9]\d{5}','BIT100081 TSU100084')
>>> ls
['100081', '100084']

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第5张图片

>>> import re
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
#将匹配到的结果去掉
['BIT', ' TSU', '']
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第6张图片

>>> import re
>>> for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
...     if m:
...         print(m.group(0))
...
100081
100084

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第7张图片

>>> import re
>>> re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TSU100084')
'BIT:zipcode TSU:zipcode'

Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第8张图片
Python网络爬虫与信息提取(北京理工大学慕课)学习笔记3_第9张图片

Re库的match对象

属性 说明
.string 待匹配的文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的结束位置
方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.endl() 匹配字符串在原始字符串的结束位置
.span() 返回(.start(), .end())
>>> import re
>>> m=re.search(r'[1-9]\d{5}','BIT100081 TSU100084')
>>> m.string
'BIT100081 TSU100084'
>>> m.re
re.compile('[1-9]\\d{5}')
>>> m.pos
0
>>> m.endpos
19
>>> m.group(0)
'100081'
>>> m.start()
3
>>> m.end()
9
>>> m.span()
(3, 9)

Re库的贪婪匹配和最小匹配

Re库默认采用贪婪匹配,即输出匹配最长的子串

>>> import re
>>> match=re.search(r'PY.*N','PYANBNCNDN')
>>> match.group(0)
'PYANBNCNDN'
>>> match=re.search(r'PY.*?N','PYANBNCNDN')
>>> match.group(0)
'PYAN'

最小匹配操作符

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配

你可能感兴趣的:(学习笔记,python,正则表达式,字符串)