我正在自学Python,无法找到对这种行为的解释:
当第一次编译regex对象并且在编译的regex对象上使用findall()方法时,结果与使用具有相同标志的findall()函数本身不同。
(从结果变量“修复”结果的不同之处删除re.I.标志。)
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']
感谢任何帮助或建议!
发布于 2021-08-02 17:38:10
编译正则表达式上的findall
方法与findall
函数具有不同的参数签名。
函数
findall(pattern, string, flags=0)
方法
findall(string, pos=0, endpos=9223372036854775807)
re.I
是一个值为2的枚举,因此您实际上要求编译的方法从位置2开始,而忽略第一个"xx“。
发布于 2021-08-02 17:38:04
在第一个例子中,您告诉findall()
从字符串的位置2开始。(re.I
的整数值为2。)所以它跳过了字符串的前两个字符。
如果查看findall()
方法的方法签名,就会发现第二个参数是pos
,而不是flags
。这是因为您必须在编译正则表达式时传递这些标志,因为它们被放入编译的regex对象中。以后不能指定它们。
https://stackoverflow.com/questions/68625758
复制相似问题