正则表达式:就是可以匹配文本片段的模式,也可以理解为一个类似字符串的公式,按照特定的模式进行匹配
1、通配符:
‘.’,可以匹配除了换行符的任意字符,至少也是至多能匹配一个字符,不能一个都不匹配,也不能匹配两个或两个以上。
因为点号能够匹配任意的单个字符,所以它就叫通配符
2、如果正则表达式中有一些特殊字符,比如逗号,引号,斜线等,这些在语言中本来就有特殊的意义,如果想让他们作为普通字符在正则表达式中,就用转义字符进行转义。
3、因为反斜线有着一些特殊的作用,那就是转义,它能够把一些不能直接插入到字符串的字符经过转化插入,比如回车符不能插入,但是\n却可以插入,我们都知道,\n就是回车。但是有的时候,在正则表达式中,如果要匹配反斜线的话,那么它就要对自己本身转义。要在正则表达式中获得单个反斜线常常要自己对自己转义。
但是总是对自己转义会很麻烦,比如匹配一串路径的时候。为了更加便捷一些,我们引用了原始字符串来作为正则表达式。在原始字符串中,不会把反斜线当做特殊字符,甚至说,在原始字符串中的每个字符都会与他的书写方式保持一致。原始字符串以r作为字符串的前缀。
理论上来说,原始字符串中可以放入任何字符,但是一个特例就是在字符串的末尾不能加入反斜线,这样python不知道这个字符串该不该结束,如果实在有在字符串尾部加入反斜线的需求的话,可以运用字符串的自动连接功能
>>> print r"xuran\\"
xuran\\
>>> print r"xuran\"
SyntaxError: EOL while scanning string literal
>>> print r"xuran" "\\"
xuran\
>>>
4、如果在想匹配任意单个字符的基础上获得 更多的控制权,可以选择字符集。字符集是由一个中括号括起来的字符集。例如"[12]xuran",字符集可以匹配它包括的任意字符,1xuran,2xuran,在逻辑上来说,是一个或的关系。要注意的就是,一个字符集内不管有多少可选字符,但是最后只能匹配一个。 还有一种形式,就是匹配除了正则表达式中的字符的字符串,这种取反的操作在字符集开头处加^符号, 例如[^abc],表示匹配不含a,b,c之外的字符串。如果确实想匹配^符号,可以再字符集中转义。
5、选择符和子模式
选择符:|,看着像LINUX的管道符号。选择符在匹配确定字符串的时候很有用,而通配符和字符集,用于匹配可变的字符。比如要匹配ptyhon和pag,则写成“python|pag”.
子模式:在整个正则表达式字符串中用括号括起来的部分。
6、问号?前面的部分,表示可以匹配一次,或者没匹配到也可以
*号表示可以匹配0次或者多次
+号表示可以匹配1次或多次
7、如果只想在开头或者结尾寻找匹配模式的子字符串的话,在正则表达式中开头加入^或者末尾加入$,就可以再特定的位置匹配一个子字符串。
比如r"^http",那么这个表达式就会匹配以http开头的字符串
8、compile(),将正则表达式编译成对象,增加匹配速度
search(),在字符串中寻找第一个匹配模式的子字符串,如果找到返回true,否则返回none.
match(),在字符串开头匹配模式,成功返回TRUE,否则返回NONE.
split(),根据在字符串中的匹配项来分割字符串
findall(),列出字符串中,所有与模式匹配的项
sub(a,s),将字符串s中的所有的a的匹配项,用b替换
escape将字符串中所有的正则运算符转义
9、经过complie编译的正则表达式对象也可以引用re模块的方法。
10、如果想用match来匹配整个字符串,可以在结尾加上$,这样就会从头一直匹配到结尾
11、整个字符串可以根据匹配的情况分为几个组,每个组就是一个子模式,用圆括号括起来的部分。0号组是整个字符串
12、为了能够让自己写出的正则表达式其他人能看懂,可以再re函数中使用VERBOSE标志,来允许在正则表达式中添加空白,但是re会忽略他们,这纯粹是为了写正则表达式的注释方便
13、贪婪匹配和非贪婪匹配
(1)任何重复运算符(*,+)都会造成贪婪匹配,即匹配尽可能多的字符
(2)在重复运算符后加上?,就是非贪婪模式,即,尽可能少的匹配。+?匹配一次或者不匹配
关于贪婪模式匹配和非贪婪模式匹配,我有个很重要的理解:
对于贪婪模式,如果在一个字符串中,有几个符合模式的字字符串,但是匹配的时候会从第一个满足模式的子字符串的起点开始,一直贪婪匹配到最后一个满足模式的子字符串的终点,期间不会再识别那些能匹配模式的子字符串,因为是贪婪匹配,除了终点和起点之外,中间的元素都会被贪婪
而非贪婪模式,要在重复符号后面加上?,".*?"并不是匹配0次,那样就没有意义了,非贪婪模式的匹配,同样会匹配一个(0个)或多个字符,但是仅会在到达下一个匹配项之前的范围内进行匹配。这才是非贪婪匹配,以前总是把非贪婪匹配当成不匹配,或者匹配一个。。。。。。哎