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

目录正则表达式findall函数问题

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

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特有的,而是正则所特有的。任何一门高级语言使用正则都满足这个特点,即有括号时只能匹配到括号中的内容。没有括号时,相当于在最外层增加了一个括号。在正则里面,“()”代表分组的意思,一个括号代表一个分组,只能匹配到"()"中的内容。

这是个人的经验,期望能够给大家提供一个参考,还期望大家能对编程网给予更多支持。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

32阅读

外国教程python,python编程教学视频

2026年09月02日

27阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

27阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读