import re string="abcdefg acbdgef abcdgfe cadbgfe" #带括号与不带括号的区别 #不带括号 regex=("((\w+)\s+\w+)") print((string)) #输出:[('abcdefg acbdgef', 'abcdefg'), ('abcdgfe cadbgfe', 'abcdgfe')] regex1=("(\w+)\s+\w+") print((string)) #输出:['abcdefg', 'abcdgfe'] regex2=("\w+\s+\w+") print((string)) #输出:['abcdefg acbdgef', 'abcdgfe cadbgfe']
第一个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple
第二个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。
第三个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。
结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。
实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容
===================================================================================================================
1.先说一下findall()函数的两种表示形式
1 import re 2 kk = (r'\d+') 3 ('one1two2three3four4') 4 #[1,2,3,4] 5 6 #注意此处findall()的用法,可传两个参数; 7 kk = (r'\d+') 8 (kk,"one123") 9 #[1,2,3]
2. 正则表达式可能遇到的坑 --- 正则表达式中有括号()
1. 正则表达式中当没有括号时,就是正常匹配,在本例中"/w+/s+/w+"第一次匹配到的字符为"2345 3456",由于是贪婪模式会 继续匹配,第二次从"4567"开始匹配匹配到的结果为字符串"4567 5678"
import re string="2345 3456 4567 5678" regex=("\w+\s+\w+") print((string)) #['2345 3456', '4567 5678']
首先的知道各个字符所表达的含义,这里只说一下/s 和 /S
\s -- 匹配任何不可见字符,包括空格、制表符、换页符等等
\S -- 匹配任何可见字符 通常[/s/S] -- 可匹配任意字符
[\s\S]*? -- 匹配懒惰模式的任意字符
2. 正则表达式中有一个括号时,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果,但是整个正则表达式执行了只不过只输出括号匹配到的内容, 在第一次匹配时跟上述没有括号时一样,匹配到 "2345 3456" ,只不过只输出(/w+)匹配 到的结果 即"2345",第二次匹配同理从"4567" 开始,匹配到"4567 5678",但是还是只是输出"4567"
import re string="2345 3456 4567 5678" regex=("(\w+)\s+\w+") print((string)) #['2345','4567']
3. 当正则表达式中有两个括号时,其输出是一个list 中包含2个 tuple,从输出的结果可以看出,有两个元组,每一个元组中有两个字符串 : 其中第一个字符串"2345 3456"是最外面的括号输出的结果,第二个是里面括号(/w+)输出的结果 "2345", 第二个元组是 第二次匹配的结果 -- 详解同第一次匹配。
import re string="2345 3456 4567 5678" regex=("((\w+)\s+\w+)") print((string)) #[('2345 3456', '2345'), ('4567 5678', '4567')]