re模块findall()详解
1. findall() 函数的2种表⽰形式
1import re
2 kk = repile(r'\d+')
3 kk.findall('one1two2three3four4')
4#[1,2,3,4]
5
6#注意此处findall()的⽤法,可传两个参数;
7 kk = repile(r'\d+')
8 re.findall(kk,"one123")
9#[1,2,3]
2. 正则表达式可能遇到的坑 --- 正则表达式中的括号()
1)当正则表达式中没有括号时,就是正常匹配,如本例中"\w+\s+\w+"
在本例中"\w+\s+\w+"第⼀次匹配到的字符为"2345 3456",由于是贪婪模式会继续匹配;第⼆次从"4567"开始匹配,匹配到的结果为字符串"4567 5678"。
1import re
2 string="2345 3456 4567 5678"
3 regex=repile("\w+\s+\w+")
4print(regex.findall(string))
5#['2345 3456', '4567 5678']
6#补充:
7#\s -- 匹配任何不可见字符,包括空格、制表符、换页符等等
8#\S -- 匹配任何可见字符通常[/s/S] -- 可匹配任意字符
9#[\s\S]*? -- 匹配懒惰模式的任意字符
2)当正则表达式中有⼀个括号时,如"(\w+)\s+\w+"其输出的内容就是括号匹配到的内容
原理:正则表达式中有⼀个括号时,其输出的内容就是括号匹配到的内容,⽽不是整个表达式所匹配到的结果,但是整个正则表达式执⾏了,只不过只输出括号匹配到的内容。
匹配过程:
1. 第⼀次匹配时跟上述没有括号时⼀样,匹配到 "2345 3456" ,只不过只输出(\w+)匹配到的结果即"2345";
2. 同理,第⼆次匹配从"4567" 开始,匹配到"4567 5678",但是只输出"4567"。
import re
string="2345 3456 4567 5678"
regex1=repile("(\w+)\s+\w+")
print(regex1.findall(string))
#['2345', '4567']
3)当正则表达式中有两个括号时,如 "((\w+)\s+\w+)",其输出结果是⼀个list 中包含2个 tuple
从输出的结果可以看出,有两个元组,每⼀个元组中有两个字符串 :
其中,第⼀个元组种的第⼀个字符串"2345 3456"是最外⾯的括号输出的结果,第⼆个字符串是⾥⾯括号(\w+)输出的结果 "2345",
第⼆个元组是第⼆次匹配的结果 -- 详解同第⼀次匹配。
import re
string="2345 3456 4567 5678"
regex2=repile("((\w+)\s+\w+)")
print(regex2.findall(string))
#[('2345 3456', '2345'), ('4567 5678', '4567')]
3. findall() 使⽤总结:
第⼀个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。
第⼆个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,⽽不是整个表达式所匹配到的结果。正则匹配括号里的内容
第三个 regex 中是带有2个括号的,我们可以看到其输出是⼀个list 中包含2个 tuple,--- 多个括号就会返回多个括号分别匹配到的结果
正则表达式的特点:
1. 有括号时只能匹配到括号中的内容,没有括号就正常匹配。
2. 在正则⾥⾯ “()” 代表的是分组的意思,⼀个括号代表⼀个分组,你只能匹配到"()"中的内容
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论