正则
语法:re.findall(r'正则的规则','被匹配的对象')
一定要记熟下边的元字符
^a:以a开头的(只找开头),没有就返回空列表[]
A\((必须是\)在后边):以a结尾(只找结尾), 没有就返回空列表[]
\n,\t:找所有,有几个列几个
组:要是组的话用.group()
print(ret.group())
以下几个就是组:
findall():找所有,有几个列几个,列表形式,没有就是空列表
finditer():#组,找所有,放到迭代器里,一个一个取,没有就报错
search()#组,找所有,找到为止,没有报错
match()#组,只找开头,不是就停止查找,就报错
举个例子:
import re
ret = re.match(r'a','cbad')
print(ret.group())
ret = re.finditer(r'ab','abxcab')
print(ret.__next__().group()) #组
print(ret.__next__().group()) #组
for i in ret:
print(i.group())
{a,b} 意思是前边内容出现m-n次范围 (ab必须挨着)
print(re.findall('a{2,4}b', 'ab aab aaab aacbaaabb'))
结果是: ['aab', 'aaab', 'aaab']
a?b 非贪婪的
print(re.findall('a?b','b ab aab abacdb aaaacb '))
结果是:['b', 'ab', 'ab', 'ab', 'b', 'b']
sub 替换 split 切割 complie
| 替换,"或"操作字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
- 组
字符 | 说明 |
---|---|
(abc) | capture group,捕获组 |
\n | backreference to group #n,分组引用,引用第 n 个捕获组匹配的内容, 其中 n 是正整数 |
(?:abc) | non-capturing group,非捕获组 |
1.4 先行断言
字符 | 说明 |
---|---|
a(?=b) | positive lookahead,先行断言,a 只有在 b 前面才匹配 |
a(?!b) | negative lookahead,先行否定断言,a 只有不在 b 前面才匹配 |
1.5 后行断言
字符 | 说明 |
---|---|
(?<=b)a | positive lookbehind,后行断言,a 只有在 b 后面才匹配 |
(?<!b)a | negative lookbehind,后行否定断言,a 只有不在 b 后面才匹配 |
惰性匹配,就是尽可能少的匹配
以下都是惰性匹配:
{m,n}?
{m,}?
??
+?
*?
1.8 修饰符
字符 | 说明 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
u | 开启"Unicode 模式",用来正确处理大于\uFFFF 的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。 |
s | 允许 . 匹配换行符。 |
y | y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g 修饰符只要剩余位置中存在匹配就可,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是"粘连"的涵义 |
(a) <=> (a+)* <=> (a)+ <=> a
(a+)+ <=> a+
其他
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
例 :邮箱的匹配
import re
d = re.findall(r'[0-9a-zA-Z_]{0,19}@163.com','232131121799qw@163.com213asdd@163.com')
print(1,d) # ['232131121799qw@163.com', '213asdd@163.com']
或者
f = re.findall(r"[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}.[com,cn,net]{1,3}", '232131121799qw@163.com213asdd@163.com')
print(f)