读-《精通正则表达式》

为什么写这篇文章

刚学完python就像找点事做,相到以后的自己打算的方向就准备从爬虫开始学习,爬虫前面学的好好,但越到后面遇到的正则表达式越看不懂,相比那些函数,这个让人难以琢磨,与其一直带着这种异或我打算在学爬虫之余好好的学习一下正则表达式,因此我们选择了这本书。
我将记录我的学习笔记,下面就开始学习之路。

python里面用对正则表达式的支持

re模块
1.什么是re ,正则表达式作为一个相对通用的语言,在python中也有对正则表达式的支持,那就是python内置的re模块,re模块则是运用正则表达式来提供一系列功能强大的接口让我们来调用。
先关函数:
findall(pattern,string, flag=0)
match和search均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到所有符合条件的元素,则需要使用findall。
findall获取分重复的匹配列表;==如果有一个组则以列表的形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表的形式返回,且每一个匹配均是元组,空的匹配也会包含在结果中。这里的模型可以当做是正则表达式.
compile()
python代码最终会被编译为字节码,之后才被解释执行。在模式匹配之前,正则表达式必须被编译成regex对线,预先编译可以提高性能,
group()与groups()
匹配对象的两个主要方法:
group() 返回所有匹配对象,或则返回某个特定的子组,返回全部匹配对象。
groups() 返回一个包含唯一或所有组的元组,如果没有子组,返回空元组。

元字符:

行的起始和结束

“^”和“$”可以认为是最好理解的元字符了," ^ "代表的是一行的开始,“ $” 代表的是一行的结束,
关于语句的理解:“^cat”匹配的是以c作为一行的第一个字符,紧接一个a,紧接着一个t的文本。
“^cat $”匹配条件是:行开头(显然,每一行都有一个开头),然后是字母cat,然后是行末尾。

字符组

1.匹配若干字符之一
如果一个字符串的一个位置有对个选择这时候就可以使用正则表达式结构体“[…]”。它容许使用者列出在某处期望匹配的字符,通常被称作字符组。“gr[ea]r”的意思是:先找到一个g,跟着是一个r,然后是一个a或者是e,最后是一个y。(字符组的内容是在同一个位置匹配的若干字符,所以它的意思是“或”)。
2.在字符内部,字符组元字符 ‘-’(连字符)表示一个范围:“H[1-6]”,“H[123456]”是完全一样的。“[0-9]”,“[a-z]”是常用的匹配数字和小写字母的简便方式。多重范围也是允许的。“[0-9a-fA-f]”可以表示:“[0123456789abcdefABCDEF]”。
并且字符组也可以和普通的文本结合在一起例如:“[0-9A-Z_!.?]”(能够匹配一个数字,大写字母,下划线,惊叹号,点号,或者是问号)。
这里要注意:只有在字符组内部连字符“-”才是元字符——否者他就只能匹配普通的连字符号,如果他在字符组的最前面也相当于一个普通的字符。
问号和点号通常被当作元字符处理,但在字符中则不是这样([0-9A-Z_!.?])里面真正特殊的就哪两个连字符。

排除性字符组

用‘[ ^…]’,这个字符组就会表示匹配任何未列出的字符。例如‘[ ^1-6]’,匹配除了1到6以外的任何字符,

用点号匹配任意字符

元字符‘.’用来匹配任意字符的字符数组的简便写法。
如果我们需要搜索‘03/19/76,03-19-76,03.19.76’,可以用‘03[-./]19[-./]76’。也可以简单地尝试‘03.19.76’ 前者的点号并不是元字符,因为他们在字符数组内部。(在字符数组里面和外面,元字符的定义和意义是不一样的)。这里的连字符同样也不是元字符,因为他们都紧接着’["
或则“ [ ^ ”之后。如果连字符不在字符组的开头,例如" [.-/]",就是用来表示范围的,在本例中就是错的用法。

单词分解符

在python中:
\b 匹配单词边界,边界上会匹配空格或起始行,实际匹配的是零宽度的不存在的东西。
\B 匹配非单词边界,即\b取反,例如,\Be\B不会匹配字母e两边的字符,但会识别e两边的字符,但会识别e两边是否是非单词边界(即但不会将边界返回到匹配结果)

import re
string = 'the the8e89ory9'
zhengze = r"\bthe\b"
str1 = re.compile(zhengze).findall(string)
print(str1)
#本来python字符串就是通过“\”来转意的,所以这里要想用到“\b”就不能让字符串中的\b转意,使用raw原生字符串
#或者是在"\b"前面在加上一个‘\b’

神奇的转义

有一个重要问题我们也会经常遇到,有一些我们经常见到的域名大致如:“XXXX.XXX.YYY”,如果正则表达式写为:“\w+.\w+.\w+”那么匹配结果往往不尽人意因为正则表达式中的 ‘.’是元字符,可以匹配除换行符以外的任何字符。
而真正匹配文本中点号的元序列应该是反斜线加上点号的组合即:‘.’称为转意的点号或者“转义的句号”。同样的如果想要匹配一个括号“()”。

正则表达式的目标

从宏观的角度看,一个正则表达式要么能够匹配给定文本中的某些字符,要么不能匹配。在编写正则表达式的时候,我们必须进行权衡;匹配符号要求的文本,同时忽略不符合要求的文本
在任何语言中,经验都十分的重要,编写正则表达式时,按照预期获得成功的匹配要花去一半的功夫,另一半的功夫用来考虑如何忽略那么些不符合要求的文本。

变量名的匹配

许多程序设计都有标识符的概念,标识符只包含字母,数字,以及下画线,不能以数字开头。‘[ a-zA-Z_ ] [a-zA-Z_0-9]’。

引号内的字符串

引号内的字符最简单的办法是使用这个表达:“"[^]"”。

美元金额

$[0-9]+(.[ 0-9][0-9]?)是一种匹配美元金额的办法。

用\s匹配所有的“空白”

前面已经看过\b表示退格,\t时候制表符,而\s则能表示所有的“空白字符”的字符组,其中包括空格符,制表符,换行符(亲测)和回车符。

\s 任何空白字符
\S 除\s之外的任何的字符
\w [a-zA-Z0-9]
\W 除\w之外的任何字符,也就是[ ^a- zA-Z0-9]
\d [0-9]
\D 除\d之外的任何字符

你可能感兴趣的:(读-《精通正则表达式》)