您的位置:首页 > 编程语言 > Python开发

Python爬虫学习纪要(三):正则表达式

2017-07-31 22:43 357 查看
一、正则表达式:

1.简单介绍:

语法说明表达式实例完整匹配的字符串
字符
.匹配任意除换行符“\n”外的字符a.babc
\转义字符a\.b

a\\c
a.c

a\c
[...]字符集,对应的位置可以式字符集中任意字符a[bcd]eabe

ace

ade
预定义字符集(可以写在字符集[…]中)
\d数字:[0-9]a\dca1c
\D非数字:[^\d]a\Dcabc
\s空白字符:[<空格>\t\r\n\f\v]a\sca c
\S非空白字符:[^\s]a\scabc
\w单词字符:[A-Za-z0-9_]a\wcabc
\W非单词字符:[^\w]a\wca c
数量词(用在 字符或(…)之后)
*匹配前一个字符0或无限次abc*ab

abcccc
+匹配前一个字符1或无限次abc+abc

abcccc
?匹配前一个字符0次或1次abc?ab

abc
{m}匹配前一个字符m次av{2}cabbc
{m,n}匹配前一个字符m至n次(注:m和n可以省略:若省略m,则匹配0至n次;若省略n,则匹配m至无限次)ab{1,2}cabc

abbc
*?+? ??

{m,n}?
使* + > {m,n}变成非贪婪模式  
边界匹配(不消耗待匹配字符串中的字符)
^匹配字符串开头

在多行模式中匹配每一行的开头
^abcabc
$匹配字符串末尾

在多行模式中匹配每一行的末尾
abc$abc
\A仅匹配字符串开头\Aabcabc
\Z仅匹配字符串末尾abc\Zabc
\b匹配\w和\W之间a\b!bca!bc
\B[^\b]a\Bbcabc
逻辑、分组
|代表左右表达式任意匹配一个

总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式
abc|defabc

def
(…)被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号‘(’,编号+1

另外分组表达式作为整体,可以后接数量词
(abc){2}

a(123|456)c
abcabc

a456c
(?P<name>…)分组,除了原有的编号外再指定一个额外的别名(?P<id>abc){2}abcabc
\<number>引用编号为<number>的分组匹配到的字符串(\d)abc\11abc1

5abc5
(?P=name)引用别名为<name>的分组匹配到的字符串(?P<id>\d)abc(?P=id)1abc1

5abc5
特殊构造(不作为分组)
(?:...)(…)的不分组版本,用于使用'|'或后接数量词(?:abc){2}abcabc
(?iLmsux)iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个(?i)abcAbC
(?#...)#后的内容将作为注释被忽略abc(?#comment)123abc123
(?=…)之后的字符串内容需要匹配表达式才能成功匹配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
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+’。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: