首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在findall()函数中使用"re.I“标志在编译的regex对象上使用函数时给出不同的结果

为什么在findall()函数中使用"re.I“标志在编译的regex对象上使用函数时给出不同的结果
EN

Stack Overflow用户
提问于 2021-08-02 17:30:16
回答 2查看 478关注 0票数 3

我正在自学Python,无法找到对这种行为的解释:

当第一次编译regex对象并且在编译的regex对象上使用findall()方法时,结果与使用具有相同标志的findall()函数本身不同。

(从结果变量“修复”结果的不同之处删除re.I.标志。)

代码语言:javascript
运行
复制
import re

emails1 = re.compile(r"([A-z0-9._+-]+@[A-z0-9._+-]+\.[A-z]{2,})")
result = emails1.findall("xxx@yyy.com", re.I)
print(result)
>>>['x@yyy.com']

emails2 = re.findall(r"([A-z0-9._+-]+@[A-z0-9._+-]+\.[A-z]{2,})", "xxx@yyy.com", re.I)
print(emails2)
>>>['xxx@yyy.com']

感谢任何帮助或建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-02 17:38:10

编译正则表达式上的findall方法与findall函数具有不同的参数签名。

函数

代码语言:javascript
运行
复制
findall(pattern, string, flags=0)

方法

代码语言:javascript
运行
复制
findall(string, pos=0, endpos=9223372036854775807)

re.I是一个值为2的枚举,因此您实际上要求编译的方法从位置2开始,而忽略第一个"xx“。

票数 4
EN

Stack Overflow用户

发布于 2021-08-02 17:38:04

在第一个例子中,您告诉findall()从字符串的位置2开始。(re.I的整数值为2。)所以它跳过了字符串的前两个字符。

如果查看findall()方法的方法签名,就会发现第二个参数是pos,而不是flags。这是因为您必须在编译正则表达式时传递这些标志,因为它们被放入编译的regex对象中。以后不能指定它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68625758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档