正则表达式再学习(这里说的是re模块)
因为在python中,想 \ 代表转义字符的前缀所以 \\ 在python中== \,这时候我们就有我们
原始字符串登场了,原始字符串中\不在被视为一个特殊的字符,所以在正则表达式中强烈推荐使用
原始字符串和一般的字符串唯一的区别在于,他的所有\都是经过转义的 就是 \ == \\
特殊字符
\d 表示任何十进制数字 0-9 类[0-9]
\D 与\d相反,匹配任何非十进制数字的字符 相当于类[^0-9]
\s 匹配任何空白字符(空格,换行符,制表符tab) 类[\t\n\t\f\v]
\S 匹配任何非空白字符 类[^\t\n\r\f\v]
\w 匹配任何单词字符
\W 匹配任何费单词字符
\b 匹配单词的开始或结束
\B 与\B相反
. 元字符,他匹配出了换行符之外的所有字符
* 元字符,他用于指定前一个字符匹配零次或者任意次 == {0,}
+ 元字符,它用于指定前一个字符匹配一次或者任意次 =={1,}
? 元字符,它用于指定前一个字符匹配一次或者零次 == {0,1}
{} 元字符, 上面几个元字符都可以使用他来表达,他的含义是,前一个字符必须匹配{m,n} m次到n次
^ 元字符匹配字符串起始的位置比如,re.search(‘^From’,’From Here to Eternity’) (那么问题就来了,为什么我不直接用match呢)
设置了MULLINE标签,他会匹配每一行的开始
$ 元字符,匹配字符创结束的位置print(re.search(‘}$’, ‘{block}’)) ,如果最后不是以}结尾的将返回None
\A 在没有设置标签的时候 == ^,设置标签后还是匹配首字母
\Z 只匹配字符串结束的位置==$
| 就是很普通的或你懂得
\b 零宽断言,就是在\b的位置,你必须是空白字符,才能算你匹配成功(基本是这样)
如何运用re模块,首先我们生成一个compile对象
\B 就是\b的另一面,必须是非空白字符
import re
p = re.compile(‘[a-z]+’)
现在p就代表一个规则。他自带了四个方法去匹配字符串
match() 从首字母开始匹配,如果string包含了规则中的字符串就代表匹配成功,匹配成功会返回一个
对象 <_sre.SRE_Match object; span=(0, 3), match=’add’>,注意,是从首字母开始匹配!!不成功就返回None
而且注意,这个span的3是最后一个匹配到字符的后一位
search()就在整个字符串里找找到就返回一个<_sre.SRE_Match object; span=(0, 3), match=’add’>对象,找不到
返回None,如果有多个能够被匹配到的字符串,那么只返回第一个
findall() 在字符串中寻找所有的符合条件的字符串,找到了就返回一个列表,注意,这里面的都是字符串形式的[‘qwe’,’weq’]酱婶儿的
findliter() 在字符串中寻找所有符合条件的字符串,找到了就返回一个迭代器,里面全是<_sre.SRE_Match object; span=(0, 3), match=’add’>对象
说一下<_sre.SRE_Match object; span=(0, 3), match=’add’>这种类型的对象叫做匹配对象‘
说明一下匹配对象自带的查看自身信息的函数
obj.group()返回匹配的字符串
obj.strat()返回匹配开始的位置
obj.end() 返回匹配结束的位置
obj.span()返回一个元组表示匹配的位置(开始,结束)
re.compile()对象不一定要创建,的看你的这个规则使用的次数多不多,如果你频繁的使用这个规则
还是创建一个对象,节省空间,提高效率,如果用的不多,match findall finditer search sub这些
也都是全局函数,两个参数,前者为规则,后者为待匹配的字符串
编译标志
A:
使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不匹配完整的 Un
icode 字符。这个标志仅对 Unicode 模式有意义,并忽略字节模式
S
DOTALL
使得 . 可以匹配任何字符,包括换行符。如果不使用这个标志,. 将匹配除了换行符的所有字符。
I
IGNORECASE
字符类和文本字符串在匹配的时候不区分大小写。举个例子,正则表达式 [A-Z]
也将会匹配对应的小写字母,像 FishC 可以匹配 FishC,fishc 或 FISHC 等。如果你不设置
LOCALE,则不会考虑语言(区域)设置这方面的大小写问题。
L
LOCALE
使得 \w,\W,\b 和 \B 依赖当前的语言(区域)环境,而不是 Unicode 数据库。
区域设置是 C 语言的一个功能,主要作用是消除不同语言之间的差异。例如你正在处理的是法
文文本,你想使用 \w+ 来匹配单词,但是 \w 只是匹配 [A-Za-z] 中的单词,并不会匹配 ‘é’ 或
‘ç’。如果你的系统正确的设置了法语区域环境,那么 C 语言的函数就会告诉程序 ‘é’ 或 ‘
ç’ 也应该被认为是一个字符。当编译正则表达式的时候设置了 LOCALE 的标志,\w+ 就
可以识别法文了,但速度多少会受到影响。
M
MULTILINE
(^ 和 $ 我们还没有提到,别着急,后边我们有细讲…)
通常 ^ 只匹配字符串的开头,而 $ 则匹配字符串的结尾。当这个标志被设置的时候,^ 不仅匹配字符串的开头,还匹配每一行的行首;& 不仅匹配字符串的结尾,还匹配每一行的行尾。
X
VERBOSE
这个标志使你的正则表达式可以写得更好看和更有条理,因
为使用了这个标志,空格会被忽略(除了出现在字符类中和使用反斜杠
转义的空格);这个标志同时允许你在正则表达式字符串中使用注释,#
符号后边的内容是注释,不会递交给匹配引擎(除了出现在字符类中和使
用反斜杠转义的 #)。
分组的概念
(ab)*表示的是,ab的多次出现,而且分组的概念之后会有子组的概念,先不展开