目录正则表达式findall函数问题及re.compile()方法的使用说明
目录正则表达式findall函数问题

re.findall()方法及re.compile()
返回结果是列表类型,需要遍历一下才能依次获取每组内容。
在字符串中查找所有与模式匹配的子串,标志位默认为0
1.例子
import re
把这段内容拆分成多个小分句后是:Hello,123456789,Word_This is just a test,666,Test。
使用正则表达式在内容中查找所有数字,将结果存储在results中 。
print(results)
for result in results:
print(result)
结果:
你提供的内容似乎并不是一个完整的句子,不太明确具体需求,请补充更详细准确的信息以便能按要求改写 。
123456789
666
进程已结束,退出代码为0 。
注意利用re.findall()函数,它没有group()和groups(),它的返回结果是一个列表。
2.re.compile()方法
re.compile(pattern[, flags])
re.compile() 能够传入忽略换行等匹配模式,如此一来,在 search() 方法中,就无需额外传入了,在 findall() 方法中,同样不需要额外传入 。
因此,re.findall()方法有2种表达方式:
import re
content等于one1,content等于two22,content等于three333,content等于four4444
pattern = re.compile(r'\d+')
print('===方法1:===')
将变量result1赋值为,通过使用re.findall函数,在content中查找符合pattern的所有子串 。
print(result1)
print('===方法2===')
将变量result2赋值为,通过pattern在content中查找所有匹配项的结果 。
print(result2)
结果:
===方法1:===
包含元素 '1',包含元素 '22',包含元素 '333',包含元素 '4444',
===方法2===
['1', '22', '333', '4444']
Process finished with exit code 0
3.在使用findall()方法时的“坑”
注意正则表达式中括号()的使用
(1)正则表达式中当没有括号时,正常匹配:
import re
数字依次为2345,3456,4567,5678,6789 。
pattern_1被定义为一个正则表达式对象,它通过re.compile函数创建,用于匹配由一个或多个单词字符以及一个空格组成的字符串,其中\w表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
打印,使用pattern_1在str1中查找所有匹配项并返回结果 。
结果:
['2345 3456', '4567 5678'] (由于内容本身简短,改写空间有限,只能保持原样。)
Process finished with exit code 0
正则表达式中有一个括号,其输出的内容是括号匹配到的内容,而非整个表达式所匹配到的结果:
import re
str1 = '2345 3456 4567 5678 6789'
pattern_1被定义为通过re.compile方法创建的正则表达式对象,该正则表达式为('(\w+)\s+\w+'),其中\w表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_] 。
print(pattern_1.findall(str1))
结果:
请你明确一下具体的改写要求哦,比如对这段内容进行润色、扩写、根据其进行描述等等,目前仅给出了两个字符串,不太清楚具体要怎么改写 。
Process finished with exit code 0
整个正则表达式执行了,只是输出的是括号匹配到的内容,也就是第一个(\w+)匹配到的内容 :
在第一次匹配的时候,情况跟上述没有括号时是一样的,匹配到了"2345 3456",只是只输出(/w+)匹配到的结果,也就是"2345";
第二次匹配也是同样的道理,它从“4567”开始进行匹配,最终匹配到了“4567 5678”,然而最后输出的依然只是(/w+)匹配到的结果,也就是“4567”。
当正则表达式里存在两个括号时,其输出为一个list,这个list中含有2个tuple 。
import re
str1 = '2345 3456 4567 5678 6789'
pattern_1被定义为一个正则表达式对象,它使用re.compile函数创建,用于匹配特定模式,该模式为两个或多个单词字符组成的序列,中间由一个空格分隔,其中\w表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_] 。
print(pattern_1.findall(str1))
结果:
包含两个元组,第一个元组是('2345 3456', '2345'),第二个元组是('4567 5678', '4567')
Process finished with exit code 0
从输出的结果能够看出,结果里包含两个元组,每个元组中有两个字符串。
第一个元组是第一次匹配得出的结果,在这个元组里,第一个字符串“2345 3456”属于正则表达式最外面的括号 。
匹配输出的结果;
第一个元组里有第二个字符串,其内容为“2345”,它是正则表达式中的括号
匹配输出的结果 ;
第二个元组是第二次匹配的结果,匹配原理与第一次匹配相同。
正则表达式findall函数问题
写正则表达式时,总会碰到不少问题,尤其是表达式存在多个元组的情况。下面来看看,re模块下的findall()函数与多个表达式元组相遇时,会出现怎样的坑。
代码如下:
import re
str="a b c d"
把长句拆分成多个小分句,用逗号隔开。不要遗漏句子末尾的标点符号。
print(regex0.findall(str))
regex1 被编译为,用于匹配,一个单词字符加上一个空格,再加上另一个单词字符的正则表达式
print(regex1.findall(str))
regex2 被编译为,用于匹配,一个空格,两侧为单词字符的正则表达式
print(regex2.findall(str))
结果:
包含('a b', 'a'),包含('c d', 'c')
['a', 'c']
包含 'a b' 以及 'c d'
可能结果有点意外,下面解释一下
结论:findall()返回的是括号所匹配到的结果,比如regex1,若有多个括号,就会返回多个括号分别匹配到的结果,例如regex,要是没有括号,就返回整条语句所匹配到的结果,像regex2。所以在提取数据时需留意这个坑。
实际上它并非Python特有的,而是正则所特有的。任何一门高级语言使用正则都满足这个特点,即有括号时只能匹配到括号中的内容。没有括号时,相当于在最外层增加了一个括号。在正则里面,“()”代表分组的意思,一个括号代表一个分组,只能匹配到"()"中的内容。
这是个人的经验,期望能够给大家提供一个参考,还期望大家能对编程网给予更多支持。