在学习Python来做一个爬虫时,是一定要知道正则表达式的,今天我就把学到的关于正则表达式的知识分享给大家,希望可以对你们有所帮助
字符
一般字符 匹配自身
. 匹配任意除换行符以外的字符
\ 转义字符,使后一个字符改变原来的意思
[] 字符集,对应的位置可以是字符集中任意字符 ^表示取反,意思是除过这些字符之外的其他字符
预定义字符集(可以写在字符集[…]中)
\d 匹配数字0-9
\D 匹配非数字
\s 空白字符 [<空格>\t\r\n\f\v]
\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 仅匹配字符串开头
\Z 仅匹配字符串末尾
/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\表示\,同样匹配一个数字也可以这样 r\d,这样写出来的表达式更加直观而且会减少出错几率
注:
这个是很基本的一些正则表达式知识,但是做一个简单的爬虫完全够用了,后面我还会把具体的使用细节写成博客分享给大家的,谢谢阅读。