Python爬虫学习纪要(三):正则表达式
2017-07-31 22:43
357 查看
一、正则表达式:
1.简单介绍:
2.数量词的贪婪模式和非贪婪模式:
Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。
3.反斜杠:
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\\”表示。同样,匹配一个数字的”\\d”可以写成r”\d”。
4.字符集:
例如'[pj]python'可以匹配'python'和'jpython',[a-zA-Z0-9]可以匹配任意一个大小写字母和数字(注:是一个)。为了反转字符集,可以将'^'放在字符串的开头,例如'[^abc]'可以匹配除a,b,c以外的任意字符。
注意:如果希望‘.’,‘*’,‘?’这些特殊字符用作文本字符,则需‘\’进行转义,但是在字符集中无必要,尽管是合法的(因为可以调整顺序来解决)。记住以下两个规则:
a. 如果‘^’出现在字符集的开头则需要转义,除非希望用作字符集反转。
b. 右中括号‘]’和横线‘-’要么放在字符集开头,要么转义。
5.可选项和重复子模块:
在子模块后面加上问号,就变成了可选项。
(pattern)?:允许模式出现0次或者1次。
(pattern)+:允许模式出现1次或者多次。
(pattern)*:允许模式出现0次或者多次。
(pattern){m,n}:允许模式出现m~n次。
6.字符串的开始和结尾:
举例说明,‘www.python.org’和‘python.www.org’中的子字符串‘www’能匹配模式‘w+’,但是只希望‘www.python.org’能匹配,则模式可用‘^w+’表示,如果希望‘python.org.www’中的子字符串‘www’能匹配‘w+’,则模式需写为‘$w+’。
1.简单介绍:
语法 | 说明 | 表达式实例 | 完整匹配的字符串 |
字符 | |||
. | 匹配任意除换行符“\n”外的字符 | a.b | abc |
\ | 转义字符 | a\.b a\\c | a.c a\c |
[...] | 字符集,对应的位置可以式字符集中任意字符 | a[bcd]e | abe ace ade |
预定义字符集(可以写在字符集[…]中) | |||
\d | 数字:[0-9] | a\dc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\sc | abc |
\w | 单词字符:[A-Za-z0-9_] | a\wc | abc |
\W | 非单词字符:[^\w] | a\wc | a c |
数量词(用在 字符或(…)之后) | |||
* | 匹配前一个字符0或无限次 | abc* | ab abcccc |
+ | 匹配前一个字符1或无限次 | abc+ | abc abcccc |
? | 匹配前一个字符0次或1次 | abc? | ab abc |
{m} | 匹配前一个字符m次 | av{2}c | abbc |
{m,n} | 匹配前一个字符m至n次(注:m和n可以省略:若省略m,则匹配0至n次;若省略n,则匹配m至无限次) | ab{1,2}c | abc abbc |
*?+? ?? {m,n}? | 使* + > {m,n}变成非贪婪模式 | ||
边界匹配(不消耗待匹配字符串中的字符) | |||
^ | 匹配字符串开头 在多行模式中匹配每一行的开头 | ^abc | abc |
$ | 匹配字符串末尾 在多行模式中匹配每一行的末尾 | abc$ | abc |
\A | 仅匹配字符串开头 | \Aabc | abc |
\Z | 仅匹配字符串末尾 | abc\Z | abc |
\b | 匹配\w和\W之间 | a\b!bc | a!bc |
\B | [^\b] | a\Bbc | abc |
逻辑、分组 | |||
| | 代表左右表达式任意匹配一个 总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式 | abc|def | abc def |
(…) | 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号‘(’,编号+1 另外分组表达式作为整体,可以后接数量词 | (abc){2} a(123|456)c | abcabc a456c |
(?P<name>…) | 分组,除了原有的编号外再指定一个额外的别名 | (?P<id>abc){2} | abcabc |
\<number> | 引用编号为<number>的分组匹配到的字符串 | (\d)abc\1 | 1abc1 5abc5 |
(?P=name) | 引用别名为<name>的分组匹配到的字符串 | (?P<id>\d)abc(?P=id) | 1abc1 5abc5 |
特殊构造(不作为分组) | |||
(?:...) | (…)的不分组版本,用于使用'|'或后接数量词 | (?:abc){2} | abcabc |
(?iLmsux) | iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个 | (?i)abc | AbC |
(?#...) | #后的内容将作为注释被忽略 | abc(?#comment)123 | abc123 |
(?=…) | 之后的字符串内容需要匹配表达式才能成功匹配 | a(?=\d) | 后面是数字的a |
(?!=…) | 之后的字符串内容需要不匹配表达式才能成功匹配 | a(?!=\d) | 后面不是数字的a |
(?<=…) | 之前的字符串内容需要匹配表达式才能成功匹配 | (?<=\d)a | 前面是数字的a |
(?<!...) | 之前的字符串内容需要不匹配表达式才能成功匹配 | (?<!\d)a | 前面不是数字的a |
(?(id/name) yes-pattern |no-pattren) | 如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern | (\d)abc(?(1)\d|abc) | 1abc2 abcabc |
Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。
3.反斜杠:
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\\”表示。同样,匹配一个数字的”\\d”可以写成r”\d”。
4.字符集:
例如'[pj]python'可以匹配'python'和'jpython',[a-zA-Z0-9]可以匹配任意一个大小写字母和数字(注:是一个)。为了反转字符集,可以将'^'放在字符串的开头,例如'[^abc]'可以匹配除a,b,c以外的任意字符。
注意:如果希望‘.’,‘*’,‘?’这些特殊字符用作文本字符,则需‘\’进行转义,但是在字符集中无必要,尽管是合法的(因为可以调整顺序来解决)。记住以下两个规则:
a. 如果‘^’出现在字符集的开头则需要转义,除非希望用作字符集反转。
b. 右中括号‘]’和横线‘-’要么放在字符集开头,要么转义。
5.可选项和重复子模块:
在子模块后面加上问号,就变成了可选项。
(pattern)?:允许模式出现0次或者1次。
(pattern)+:允许模式出现1次或者多次。
(pattern)*:允许模式出现0次或者多次。
(pattern){m,n}:允许模式出现m~n次。
6.字符串的开始和结尾:
举例说明,‘www.python.org’和‘python.www.org’中的子字符串‘www’能匹配模式‘w+’,但是只希望‘www.python.org’能匹配,则模式可用‘^w+’表示,如果希望‘python.org.www’中的子字符串‘www’能匹配‘w+’,则模式需写为‘$w+’。
相关文章推荐
- Python爬虫学习纪要(四):正则表达式1
- Python爬虫学习纪要(五):正则表达式2
- [Python] 网络爬虫和正则表达式学习总结
- 【python爬虫学习2.正则表达式】
- 在学习python网络爬虫时用到的正则表达式
- 【python爬虫专题】解析方法 <3> 正则表达式学习
- python爬虫学习之re正则表达式
- (转)Python爬虫学习笔记(2):Python正则表达式指南
- python——爬虫学习——正则表达式与Re库-(4)
- [置顶] Python爬虫学习(四)正则表达式
- Python学习笔记 第二部分 - 正则表达式 与 爬虫小实例(抓取豆瓣电影中评分大于等于8分的影片)
- python爬虫学习实践(一):requests库和正则表达式之淘宝爬虫实战
- Python爬虫包 BeautifulSoup 学习(九) 正则表达式与Lambda表达式
- python爬虫学习(1)--关于正则表达式输入和提取中文
- python爬虫学习三:python正则表达式
- Python基础学习——正则表达式与第一个爬虫(requests)
- Python 爬虫学习笔记之正则表达式
- python爬虫之正则表达式学习笔记一
- python爬虫学习---正则表达式的使用
- Python爬虫学习---5分钟掌握正则表达式