Python爬虫实战基础篇(1)正则表达式
在学习Python来做一个爬虫时,是一定要知道正则表达式的,今天我就把学到的关于正则表达式的知识分享给大家,希望可以对你们有所帮助
字符
一般字符 匹配自身
. 匹配任意除换行符以外的字符
转义字符,使后一个字符改变原来的意思
[] 字符集,对应的位置可以是字符集中任意字符 ^表示取反,意思是除过这些字符之外的其他字符
预定义字符集(可以写在字符集[…]中)
d 匹配数字0-9 D 匹配非数字 s 空白字符 [<空格> fv] S 非空白字符[^s] w 单词字符[a-z A-Z 0-9] W 非单词字符[^w]
数量词(用在字符或(…)之后)
* 匹配前一个字符0或无限次
+ 匹配前一个字符1次或无限次
? 匹配前一个字符0次或一次
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符m-n次 ,若省略m,则匹配0-n次,若省略n,匹配m到无限次
*?+???{m,n}? 使*+?{m,n}变成非贪婪模式
边界匹配
^ 匹配字符串开头,在多行模式匹配每一行的开头
$ 匹配字符串末尾,在多行模式匹配每一行的末尾
A 仅匹配字符串开头
仅匹配字符串末尾
/b 匹配w和W之间
/B [^/b]
逻辑分组
| 代码左右表达式任意匹配一个,总是先尝试左边的表达式,一旦匹配成功则跳过匹配右边的表达式,如果|没有被包括在()中,范围就是整个正则表达式 (...) 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号(,编号加1,另外,分组表达式作为一个整体,可以后接数量词,表达式中的|仅在改组有效) (?P<name>...) 分组,除了原来的编号外再指定一个额外的别名 <number> 引用编号为<number>的分组匹配到的字符串 (?P = name) 引用别名<name>的分组匹配到的字符串
特殊构造(不作为分组)
(?:...) (...)的不分组版本,用于使用|或后接数量词 (?iLmsux) iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个 (?#...) #后的内容将作为注释被忽略 (?!...) 之后的表达式内容需要不匹配表达式才能成功匹配 (?<=...) 之前的字符串需要匹配表达式才能成功匹配 (?<!...) 之前的字符串内容需要不匹配表达式才能成功匹配 (?(id/name)yes-pattern|no-pattern) 如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern |no-pattern 可以省略
1.2数量词的贪婪模式和非贪婪模式
-
正则表达式通常用于在文本中查找匹配的字符串,Python里数量词默认是贪婪的,总是长沙市匹配尽可能多的字符,非贪婪刚好相反,总是尝试匹配尽可能少的字符
关于反斜杠
-
在Python中,也是使用作为转义字符,这个时候如果你要去匹配文本中的字符,那么使用编程语言表示的正则表达式则需要4个,这样是不太麻烦了?那么使用Python里面的原生字符串可以解决掉这个问题。可以使用r表示,同样匹配一个数字也可以这样 rd,这样写出来的表达式更加直观而且会减少出错几率
