32、正则表达式

Life is short, you need Python!

上集回顾:

  1. 人社部行政区划抓取需求分析
  2. 代码实现

前面学习了使用BeautifulSoap进行简单的网页数据抓取,中间有用到正则表达式进行字符串匹配,本集继续简单学习下基础的正则表达式用法。
Python官方文档关于正则表达式的介绍链接

正则表达式特殊字符:

. ^ $ * + ? { } [ ] \ | ( )
  1. [ 和 ]
    它们用于指定字符类,它是你希望匹配的一组字符。 可以单独列出字符,也可以通过给出两个字符并用 '-' 标记将它们分开来表示一系列字符。 例如, [abc] 将匹配任何字符 a、 b 或 c ;这与 [a-c] 相同,它使用一个范围来表示同一组字符。 如果你只想匹配小写字母,你的正则是 [a-z] 。
  2. [^...]
    通过包含一个 '^' 作为该类的第一个字符来表示匹配未列出的字符。 例如,[^5] 将匹配除 '5' 之外的任何字符。 如果插入符出现在字符类的其他位置,则它没有特殊含义。 例如:[5^] 将匹配 '5' 或 '^'。

  3. 最重要的元字符是反斜杠,\。 与 Python 字符串文字一样,反斜杠后面可以跟各种字符,以指示各种特殊序列。它也用于转义所有元字符,因此您仍然可以在模式中匹配它们;例如,如果你需要匹配 [ 或 \,你可以在它们前面加一个反斜杠来移除它们的特殊含义:[ 或 \。
    一些以 '' 开头的特殊序列表示通常有用的预定义字符集,例如数字集、字母集或任何非空格的集合。

\d
匹配任何十进制数字;这等价于类 [0-9]。
\D
匹配任何非数字字符;这等价于类 [^0-9]。
\s
匹配任何空白字符;这等价于类 [ \t\n\r\f\v]。
\S
匹配任何非空白字符;这相当于类 [^ \t\n\r\f\v]。
\w
匹配任何字母与数字字符;这相当于类 [a-zA-Z0-9_]。
\W
匹配任何非字母与数字字符;这相当于类 [^a-zA-Z0-9_]。

这些序列可以包含在字符类中。 例如,[\s,.] 是一个匹配任何空格字符的字符类或者 ',' ,或 '.'。

  1. 重复(*+?)
    能够匹配不同的字符集合是正则表达式可以做的第一件事,这对于字符串可用方法来说是不可能的。 但是,如果这是正则表达式的唯一额外功能,那么它们就不会有太大的优势。 另一个功能是你可以指定正则的某些部分必须重复一定次数。

重复中我们要了解的第一个元字符是 。 * 与字面字符 '' 不匹配;相反,它指定前一个字符可以匹配零次或多次,而不是恰好一次。

例如,ca*t 将匹配 'ct' (0个 'a' 字符),'cat' (1个 'a' ), 'caaat' (3个 'a' 字符),等等。

类似 * 这样的重复是 贪婪的;当重复正则时,匹配引擎将尝试尽可能多地重复它。 如果模式的后续部分不匹配,则匹配引擎将回退并以较少的重复次数再次尝试。

一个逐步的例子将使这更加明显。 让我们考虑表达式 a[bcd]*b。 这个正则匹配字母 'a',类 [bcd] 中的零或多个字母,最后以 'b' 结尾。 现在想象一下这个正则与字符串 'abcbd' 匹配。

步骤 匹配 说明
1 a 正则中的 a 匹配。
2 abcbd 引擎尽可能多地匹配 [bcd]* ,直到字符串结束。
3 失败 引擎尝试匹配 b ,但是当前位置位于字符串结束,所以匹配失败。
4 abcb 回退一次,[bcd]* 少匹配一个字符。
5 失败 再次尝试匹配 b , 但是当前位置是最后一个字符 'd' 。
6 abc 再次回退,所以 [bcd]* 只匹配 bc 。
6 abcb 再试一次 b 。 这次当前位置的字符是 'b' ,所以它成功了。

正则现在已经结束了,它已经匹配了 'abcb'。 这演示了匹配引擎最初如何进行,如果没有找到匹配,它将逐步回退并一次又一次地重试正则的其余部分。 它将回退,直到它为 [bcd]* 尝试零匹配,如果随后失败,引擎将断定该字符串与正则完全不匹配。

另一个重复的元字符是 +,它匹配一次或多次。 要特别注意 * 和 + 之间的区别;* 匹配 零次 或更多次,因此重复的任何东西都可能根本不存在,而 + 至少需要 一次。 使用类似的例子,ca+t 将匹配 'cat' (1 个 'a'),'caaat' (3 个 'a'),但不会匹配 'ct'。

还有两个重复限定符。 问号字符 ? 匹配一次或零次;你可以把它想象成是可选的。 例如,home-?brew 匹配 'homebrew' 或 'home-brew'。

最复杂的重复限定符是 {m,n},其中 m 和 n 是十进制整数。 这个限定符意味着必须至少重复 m 次,最多重复 n 次。 例如,a/{1,3}b 将匹配 'a/b' ,'a//b' 和 'a///b' 。 它不匹配没有斜线的 'ab',或者有四个的 'a////b'。

你可以省略 m 或 n; 在这种情况下,将假定缺失值的合理值。 省略 m 被解释为 0 下限,而省略 n 则为无穷大的上限。

还原论者的读者可能会注意到其他三个限定符都可以用这种表示法表达。 {0,} 与 * 相同, {1,} 相当于 + , {0,1} 和 ? 相同。 最好使用 * , + 或 ? ,只要因为它们更短更容易阅读。

  1. '^' 和 '$'
    不在中括号内, '^'表示匹配字符串的开头位置,'$'表示匹配字符串的结束位置。

本集总结:

  1. 正则表达式特殊符号

下集见

你可能感兴趣的:(32、正则表达式)