文章目录
- re基础语法
-
- 运算优先级
- 常用正则表达式
-
- 单个字符
- 组合字符
- findall函数的应用
re这个模块提供了与 Perl 语言类似的正则表达式匹配操作。其模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字节串 (bytes)。 但是,Unicode 字符串与8位字节串不能混用:也就是说,你不能用一个字节串模式去匹配 Unicode 字符串,反之亦然;类似地,当进行替换操作时,替换字符串的类型也必须与所用的模式和搜索字符串的类型一致。
re基础语法
正则表达式可以包含普通或者特殊字符。绝大部分普通字符,比如 ‘A’, ‘a’, 或者 ‘0’,都是最简单的正则表达式。它们就匹配自身。你可以拼接普通字符,所以 last 匹配字符串 ‘last’. (在这一节的其他部分,我们将用 this special style 这种方式表示正则表达式,通常不带引号,要匹配的字符串用 ‘in single quotes’ ,单引号形式。)
有些字符,比如 ‘|’ 或者 ‘(’,属于特殊字符。 特殊字符既可以表示它的普通含义, 也可以影响它旁边的正则表达式的解释。
重复修饰符 (, +, ?, {m,n}, 等) 不能直接嵌套。这样避免了非贪婪后缀 ? 修饰符,和其他实现中的修饰符产生的多义性。要应用一个内层重复嵌套,可以使用括号。 比如,表达式 (?:a{6}) 匹配6个 ‘a’ 字符重复任意次数。
运算优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。
下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,“或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
常用正则表达式
单个字符
1. . 就 是匹配除 \n (换行符)以外的任意一个字符
str = 'aabbabaabbaa'
print(re.findall(r'a.b',str))
['aab', 'aab']
2. *前面的字符匹配0次或以上
str = 'aabbabaabbaa'
print(re.findall(r'a*b',str))
['aab', 'b', 'ab', 'aab', 'b']
3. +前面的字符匹配1次或以上
str = 'aabbabaabbaa'
print(re.findall(r'a+b',str))
['aab', 'aab']
4. ?前面的字符匹配0次或1次
str = 'aabbabaabbaa'
print(re.findall(r'a?b',str))
['aab', 'ab', 'ab', 'aab', 'ab']
5. {m}对其之前的正则式指定匹配 m 个重复
少于 m 的话就会导致匹配失败。比如, a{6} 将匹配6个 ‘a’ , 但是不能是5个。
6. {m,n}对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。
比如,a{3,5} 将匹配 3 到 5个 ‘a’。忽略 m 意为指定下界为0,忽略 n 指定上界为无限次。 比如 a{4,}b 将匹配 ‘aaaab’ 或者1000个 ‘a’ 尾随一个 ‘b’,但不能匹配 ‘aaab’。逗号不能省略,否则无法辨别修饰符应该忽略哪个边界。
组合字符
’*‘ 和 '+‘修饰符都是 贪婪的,它们在字符串进行尽可能多的匹配;在修饰符之后添加 ‘?’ 将使样式以 非贪婪方式进行匹配,尽量少的字符将会被匹配。
1. .*贪婪,匹配从.*前面为开始到后面为结束的所有内容
str = 'aabbabaabbaa'
print(re.findall(r'a.*b',str))
['aabbabaabb']
2. .*? 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取
['aab', 'ab', 'aab']
3. (.*?) 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容
['a', '', 'a']
findall函数的应用
它在re.py中有定义:
def findall(pattern, string, flags=0):
"""Return a list of all non-overlapping matches in the string.
If one or more capturing groups are present in the pattern, return
a list of groups; this will be a list of tuples if the pattern
has more than one group.
Empty matches are included in the result."""
return _compile(pattern, flags).findall(string)
即返回string中所有与pattern匹配的全部字符串,返回形式为数组。
import re
str = '一段字符串'
print(re.findall(r'正则表达式',str))
re.findall( r’正则表达式’, str, re.S),参数有re.S,则不会对’\n’进行中断
参考资料:
re — 正则表达式操作
正则表达式基本用法