转自https://www.cnblogs.com/mosson/articles/5821825.htm
正则本身就是一门语言:
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,在文本处理方面功能非常强大,也经常用作爬虫,来爬取特定内容,Python本身不支持正则,但是通过导入re模块,Python也能用正则表达式,下面就来讲一下python正则表达式的用法。
下图列出了Python支持的正则表达式元字符和语法:
一、Python正则的字符:
1、普通字符:
大多数的字符和字母都会和自身匹配
2、元字符:
元字符:. ^ $ * + ? { } [ ] | ( ) \
2.1、[]详解
例如,[abc] 将匹配"a", "b", 或 "c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么 RE 应写成 [a-z].
2.2()详解
1 2 3 4 5 6 7 8 |
|
2.3:+、*、?、{}详解
贪婪模式和非贪婪模式:
从前面的描述可以看到'*','+'和'?'都是贪婪的,但这也许并不是我们说要的,所以,可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的RE。示例,
1 2 3 4 5 |
|
正则匹配的时候的 r 的作用
1 2 3 4 |
|
二、re模块的各种方法
1、findall (获取字符串中所有的匹配字符串)
findall(),可以将匹配到的结果以列表的形式返回,如果匹配不到则返回一个空列表,下面来看一下代码中的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
find 的高级用法:?:
默认是取分组()内的信息,但是我想让分组外的匹配信息也取到,就要用到 ?:
1 2 3 4 5 |
|
finditer():迭代查找
1 2 3 4 5 6 7 8 9 |
|
2、match(pattern, string, flag=0)
- 正则表达式
- 要匹配的字符串
- 标志位,用于控制正则表达式的匹配方式
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
3、search(pattern, string, flag=0)
根据模型去字符串中匹配指定内容,匹配单个,只匹配一次,可以结合split 将匹配到内容分割 拼接 然后再次循环查找。因为findall尽管可以找到所有,但是在处理分组()时候分组外的内容匹配不到。而findall是返回列表 后面会有介绍
4、grouop和groups
group(0) 显示全部
group(1) 显示第一个分组()
group(2) 显示第二个分组()
如果没有分组或超出分组个数就会报错
5、sub(pattern, repl, string, count=0, flag=0)
用于替换匹配的字符串 pattern内必须为正则表达式,不能是正则表达式search或findall 查找到的赋值变量
比如我的计算器处理括号的方法,用正则search匹配到后,不能直接将变量出入 sub的pattern,因为不起作用
sub 疑点
sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
subn方法 返回总共替换的次数
1 2 |
|
subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):
返回 (sub(repl, string[, count]), 替换次数)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
6、split(pattern, string, maxsplit=0, flags=0)
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。
1 2 3 4 5 6 |
|
7 re.compile(strPattern[, flag]): compile 编译方法
如果一个匹配规则,以后要使用多次,就可以先将其编译,以后就不用每次都在去写匹配规则
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为
Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'
表示同时生效,比如re.I | re.M
可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则
表达式编译成正则表达式对象,这样可以提高一定的效率。下面是一个正则表达式
对象的一个例子:
1 2 3 4 |
|
三、原生字符串、编译、分组
1、原生字符串
细心的人会发现,我每一次在写匹配规则的话,都在前面加了一个r,为什么要这样写,下面从代码上来说明,
1 2 3 4 5 6 7 |
|
你可能注意到我们在正则表达式里使用“\d”,没用原始字符串,也没出现什么问题。那是因为ASCII 里没有对应的特殊字符,所以正则表达式编译器能够知道你指的是一个十进制数字。但是我们写代码本着严谨简单的原理,最好是都写成原生字符串的格式。
2、编译
如果一个匹配规则,我们要使用多次,我们就可以先将其编译,以后就不用每次都在去写匹配规则,下面来看一下用法
1 2 3 |
|
3、分组
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()
表示的就是要提取的分组,可以有多个组,分组的用法很多,这里只是简单的介绍一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|