Pyhton——re模块
一、
re模块里有两种字符:
1、普通字符: 大多数字符和字母都会和自身匹配
2、元字符: . ^ $ * + ? { } [ ] | ( ) \
1、re.findall(“xx1”,“xx2”)——完全匹配。(xx1为要匹配的关键字,xx2为被匹配的内容)
2、. ——通配符(功能是任何字符都可以代替,除了“\n” 换行符)
3、^ ——从开头去匹配
4、 $ ——从结尾去匹配
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、
重复符号(重复紧挨着前面的那个字符)
1、* ——重复0到无穷次
由于是0到无穷次,所以第一个"d"没有匹配上,也算
2、+ ——重复1到无穷次
3、 ? ——重复0到1次(如果有1次取1次,没有取0次)
4、{x} ——重复次数自己定,比如:
{2},重复两次.
{5},重复5次
如果是{2,5},则重复2到5次(包括2次跟5次)
注意:前面的 * + ? 等都是贪婪匹配,也就是取最大的数(比如有3个就取3个,有5个取5个,不会取两个,也不会取1个)。在后面加个 ?则变成惰性匹配,取最小
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
三、
[ ]——字符集
1、字符集里的字符与前面的字符形成组合进行匹配
2、前面说的符号在字符集里都变成普通符号
3、字符集里面的特殊符号
虽然前面的符号在字符集里变成普通符号,但是字符集里有另外的特殊符号 - ^ \
3(1)、 - ——这个减号意思是范围,比如:a-z,是a到z的意思
如果是重复字符集里需要多个,则:
3(2)、 ^ ——字符集里的尖角号意思是:非
a 到 f 都不匹配,所以匹配出az
3(3)、 \ ——让有意义的字符变没意义,让没意义的字符变有特定意义
反斜杠后边跟元字符去除特殊功能,比如 \ .
反斜杠后边跟普通字符实现特殊功能,比如\d
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_ ]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_ ]。
\b 匹配一个特殊字符边界,比如空格 ,&,#等
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
4、转义字符 \ 相关知识
在匹配规则前加一个 r ,其意思是:原生字符串,意味着使匹配规则里面的字符不作任何转义,没有特殊意义。
匹配失败
匹配成功
另外一种方法:
在前面加个 \ ,使第二个 \ 失去特殊意义
由于这个re模块,需要经过python解释器的编译,再进入re模块里,所以两个反斜杠变成一个反斜杠,这个反斜杠暂时没有意义,等进入到re模块里,这个反斜杠又有了意义,此时的 \b 就有其特殊意义,最后就能匹配成功。
同理:
这里的四个反斜杠,第一、三反斜杠使二四反斜杠失去特殊意义,变为普通符号,进入到正则后,两个反斜杠又变成一个普通字符 \ ,这时匹配成功,而后出来经过反编译,会输出两个反斜杠
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
四、
| ——意为“或”
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
re.findall() 与 re.search() 区别:
findall() 会把所有匹配出的结果放到一个列表里面。
search()只会把第一个匹配出的结果拿出来放到一个对象里面。如果匹配不成功,则什么都不会返回。如果要取出这个对象里面的数值,用group()方法。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
( ) ——分组功能
当要把零散的字符当成一个整体,就用括号括起来
没有括号
有括号
注意:
这里虽然把 abc 当作整体,但是匹配出来的结果不是想要的 abcabcabc ,这是因为findall()会优先把匹配结果组里的内容返回(也就是 abc), 如果想要匹配出 abcabcabc ;则取消权限即可。可在 abc 前面加 ?: 此时就会把优先权限取消。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
分组之 ?P< name > —— 注意:P要大写
此功能是给匹配出来的内容分组命名
只要名字:
只要年龄:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
re模块下的方法:
findall() 与 search() 具体用法看前面
1、re.match() ——从开头进行匹配,匹配不成功会报错。匹配成功用group()取出来;此方法用的很少,多数用search() 。
2、re.spilt() —— 分割。
注意:如果左边没有内容,则会分割出一个 空(" ")出来。
3、re.sub(“xx1”,“xx2”.“xx3”) —— 替换。xx1为替换前对象;xx2为替换后对象;xx3为内容
3、re.subn() —— 使用方法跟sub一样。结果会做成一个元组,返回替换次数
4、re.compile() —— 可以把匹配规则装进一个变量里;如果需要对多个内容进行同一个规则匹配,则可以使用此方法
5、re.finditer() —— 跟 findall() 差不多,会把结果封装进一个迭代器,返回迭代器对象