为什么在 findall() 函数中使用 "re.I" 标志会在编译的正则表达式对象上使用函数与自身使用的函数时给出不同的结果
Why using "re.I" flag in findall() function gives different results when function is used on the compiled regex object vs function used by itself
我正在自学 Python,无法找到此行为的解释:
当第一次编译 regex 对象时,findall() 方法用于编译后的 regex 对象 re.I标志,结果不同于使用具有相同标志的 findall() 函数本身。
(从 result 变量中删除 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']
感谢任何帮助或建议!
在您的第一个示例中,您告诉 findall()
从字符串的位置 2 开始。 (re.I
的整数值为 2。)所以它会跳过字符串的前两个字符。
如果您查看 findall()
方法的方法签名,您会发现第二个参数是 pos
,而不是 flags
。那是因为你必须在编译正则表达式时传递标志,因为它们被嵌入到编译的 regex 对象中。您以后不能指定它们。
已编译正则表达式上的 findall
方法与 findall
函数具有不同的参数签名。
函数
findall(pattern, string, flags=0)
方法
findall(string, pos=0, endpos=9223372036854775807)
re.I
是一个值为 2 的枚举,因此您实际上是在要求编译后的方法从位置 2 开始,忽略第一个“xx”。
我正在自学 Python,无法找到此行为的解释:
当第一次编译 regex 对象时,findall() 方法用于编译后的 regex 对象 re.I标志,结果不同于使用具有相同标志的 findall() 函数本身。
(从 result 变量中删除 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']
感谢任何帮助或建议!
在您的第一个示例中,您告诉 findall()
从字符串的位置 2 开始。 (re.I
的整数值为 2。)所以它会跳过字符串的前两个字符。
如果您查看 findall()
方法的方法签名,您会发现第二个参数是 pos
,而不是 flags
。那是因为你必须在编译正则表达式时传递标志,因为它们被嵌入到编译的 regex 对象中。您以后不能指定它们。
已编译正则表达式上的 findall
方法与 findall
函数具有不同的参数签名。
函数
findall(pattern, string, flags=0)
方法
findall(string, pos=0, endpos=9223372036854775807)
re.I
是一个值为 2 的枚举,因此您实际上是在要求编译后的方法从位置 2 开始,忽略第一个“xx”。