1.避免转义字符引起的问题
2. 分组的进阶
-
分组(捕获分组:只捕获分组中内容,其他只要匹配即可)
- group()返回匹配的字符串
-
groups()以元组的形式返回符合所有组中匹配的字符串,一个组为一个字符串
- group(n) 第n个分组中匹配到的内容str,组编号是从 1 开始的
-
start() 返回匹配的起始位置
- end() 返回匹配的结束位置
-
span(group=0) 返回匹配的索引位置元组
- span(group=n) 返回匹配第n个组的索引位置
- 出现(){m}一个分组匹配多次的这种情况,span()会将这个组的最后一次匹配索引位置输出
import re
p1 = r'(123){2}(da)'
m = re.search(p1,'55123123dasdasda123123asd')
print(m)
print(m.group())
print(m.groups())
print(m.group(1))
// 输出
<_sre.SRE_Match object; span=(2, 10), match='123123da'>
123123da
('123', 'da')
123
【注】(123){2}只分了一个组,{2}只是指匹配两次
(?P<分组名>正则表达式)
p = r‘<([\w]+)>.*</\1>’
\1指引用分组([\w]+)匹配到的内容,进行匹配
import re
regex = re.compile(r'\d+')
str1 = '55123123dasdasda123123'
regex2 = re.compile(r'((\w)\w*?\2)')
allstr2 = regex2.findall(str1)
print(allstr2)
# [('55', '5'), ('1231', '1'), ('23dasdasda12', '2'), ('3123', '3')]
介绍:只是将小括号作为一个整体进行匹配,要捕获整个正则表达式
使用:(?:正则表达式)
3. 编译正则表达式
re.compile(pattern[,flags=0])
标识 | 含义 |
---|---|
re.S ---- re.DOTALL | 使得.匹配包括换行符在内的所有字符(’.'不包含换行符) |
re.I ---- re.IGNORECASE | 使得匹配对大小写不敏感 |
re.M ---- re.MUTILINE | 多行匹配。(影响^和$) |
re.X ---- re.VERBOSE | 能够让正则表达式组织(表现)的清晰易懂。为了增加可读性,忽略空格和 # 后面的注释 |
re.A — re.ASCII | 采用ASCII编码 |
re.U — re.UNICODE | 采用UNICODE编码 |
4. 常用的方法(快速回忆)
1. re.match(pattern, string, flag=0)
2. re.search(pattern, string, flag=0)
3. re.findall(pattern, string, flag=0)
返回一个列表
4. re.finditer(pattern, string, flag=0)
5. re.sub(pattern, rep1, string, count=0 , flag=0)
6. re.subn(pattern, rep1, string, flag=0 )
7. re.spilt(pattern,string,maxsplit = 0,flag=0)
8. re.compile(pattern, flag=0)
regex = re.compile(r'\d+')
str1 = '55123123dasdasda123123'
allstr = regex.findall(str1,2,len(str1))
print(allstr)
['123123', '123123']