Python爬虫 正则表达式应用详解

Python爬虫(二十一)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— 正则表达式应用详解 ——

相关文章:
1.Python的Re库应用详解(正则表达式的库)
2.Python的Re库与正则表达式的细节解析(正则表达式的库)

1. 简介

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

  • 正则表达式模式被编译成一系列的字节码,然后由一个 C 语言写的匹配引擎所执行。

  • 正则表达式是用来简洁表达一组字符串的表达式

    • 通用的字符串表达框架

    • 简洁表达一组字符串的表达式

    • 针对字符串表达“简洁”和“特征”思想的工具

    • 判断某字符串的特征归属

  • 正则表达式在文本处理中十分常用

    • 表达文本类型的特征(病毒、入侵等)

    • 同时查找或替换一组字符串

    • 匹配字符串的全部或部分

  • 正则表达式的使用

    • 编译:将符合正则表达式语法的字符串转换成正则式表达特征
      正则表达式应用详解

2. 语法

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

  • 有一些符号不能匹配自身,它们定义了字符类、子组匹配和模式重复次数等功能,被称为元字符 (metacharacter)。
  • 元字符包括:. ^ $ * + ? { } [ ] \ | ( )
  • 正则表达式的常用操作符
    在反斜杠后边紧跟着一个元字符,那么元字符的“特殊功能”也不会被触发
操作符说明实例
.表示任何单个字符(除换行符) 【注1】
[ ]字符集,对单个字符给出取值范围,元字符在方括号中不会触发功能[abc$]表示a、b、c、$,[a­-z]表示a到z单个字符
[^ ]非字符集,对单个字符给出排除范围[^abc]表示非a或b或c的单个字符
*前一个字符0次或无限次扩展 【注2】abc* 表示 ab、abc、abcc、abccc等
+前一个字符1次或无限次扩展abc+ 表示 abc、abcc、abccc等
?前一个字符0次或1次扩展abc?表示 ab、abc
|左右表达式任意一个 【注3】|abc|def 表示 abc、def
{m}扩展前一个字符m次ab{2}c 表示 abbc
{m,n}扩展前一个字符m至n次(含n) 【注4】ab{1,2}c 表示 abc、abbc
^匹配字符串开头^abc 表示abc且在一个字符串的开头
$匹配字符串结尾abc$ 表示abc且在一个字符串的结尾
( )分组标记,内部只能使用 | 操作符(abc) 表示abc,(abc|def) 表示 abc、def
\后边跟元字符去除特殊功能,跟普通字符实现特殊功能,如需消除反斜杠的特殊功能只需在前面再加一个反斜杠\\\d \w \u
\d匹配十进制数字,等价于[0­-9]
\D与 \d 相反,匹配非十进制数字的字符,相当于 [^0-9]
\s匹配空白字符(包含空格、换行符、制表符等),等价于 [ \t\n\r\f\v]
\S与 \s 相反,匹配非空白字符,等价于 [^ \t\n\r\f\v]
\w单词字符 【注5】 ,等价于[A­-Z,a­-z,0­-9]
\W于 \w 相反
\b匹配单词的开始或结束
\B与 \b 相反
\Z只匹配字符串的结束位置。

【注1】:如果设置了 re.DOTALL 标志,. 将匹配包括换行符在内的任何字符。

【注2】:由于受到 C 语言的 int 类型大小的内部限制,正则表达式引擎会限制字符重复个数不超过 20 亿个;

【注3】:为了能够更加合理的工作,| 的优先级非常低。例如 banana|orange 应该匹配banana 或 orange,而不是匹配 banan,然后一个 ‘a’ 或 ‘o’。同样,我们使用 \| 来匹配 |字符本身;或者包含在一个字符类中,像这样 [|]

【注4】:可以省略 m 或者 n,引擎会假定一个合理的值代替。省略 m,将被解释为下限 0;省略 n 则会被解释为无穷大(事实上是上边我们提到的 20 亿)。

【注5】\w 匹配任何字符。如果正则表达式以字节的形式表示,这相当于字符类 [a-zA-Z0-9_];如果正则表达式是一个字符串\w 会匹配所有 Unicode 数据库(unicodedata 模块提供)中标记为字母的字符。你可以在编译正则表达式的时候,通过提供 re.ASCII 表示进一步限制 \w 的定义。

3. 部分元字符应用详解

^

匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。

举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From

print(re.search('^From', 'From Here to Eternity'))  
print(re.search('^From', 'Reciting From Memory'))

结果如图:
正则表达式应用详解

$

匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。

print(re.search('}$', '{block}'))  

print(re.search('}$', '{block} '))

print(re.search('}$', '{block}\n'))  

结果如图:

正则表达式应用详解

同样,我们使用 $ 来匹配 $字符本身;或者包含在一个字符类中,像这样 [$]

\A

只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候,\A 和 ^ 的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同:\A 还是匹配字符串的起始位置,但 ^ 会对字符串中的每一行都进行匹配。

\b

单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。

零宽断言相关信息请点击零宽断言查看。

下边例子中,class 只有在出现一个完整的单词 class 时才匹配;如果出现在别的单词中,并不会匹配。

p = re.compile(r'\bclass\b')
print(p.search('no class at all'))  

print(p.search('the declassified algorithm'))

print(p.search('one subclass is'))

结果如图:
正则表达式应用详解
在使用这些特殊的序列的时候,有两点是需要注意的:

第一点是,Python 的字符串跟正则表达式在有些字符上是有冲突的。比如说在 Python 中,\b 表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将 \b 转换成退格符处理,这样就肯定跟你的预期不一样了。
相关原理和解决方法点击详情查看。

第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中,\b 只是用来表示退格符。

\B

另一个零宽断言,与 \b 的含义相反,\B 表示非单词边界的位置。

3. 正则表达式实例

正则表达式应用详解
经典正则表达式实例
正则表达式应用详解
匹配IP地址的正则表达式

IP地址字符串形式的正则表达式(IP地址分分4段,每段0­255) \d+.\d+.\d+.\d+ \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} 不精确

精确写法

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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值