我在使用python re
库时遇到了以下行为
>>> import re
>>> re.sub(pattern=".*", repl="r", string="hello")
'rr'
如您所见,对于模式.*
和替换字符(r
)re.sub
方法,返回rr
。但是我希望结果是r
,因为.*
将匹配整个字符串。为什么?。我也在Go中测试了同样的逻辑,但它返回了预期的结果
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`.*`)
fmt.Println(re.ReplaceAllString("Hello", "r")) // Will print `r`
}
下面应该开始解释发生了什么:
在字符串中的每个位置
re.sub
尝试匹配x?
。它成功了,因为x?
可以匹配空字符串,并用_
替换空字符串以类似的方式,在下面
我们发现
re.sub
尝试匹配位置0中的.*
,成功并使用整个字符串。然后它尝试在结束位置匹配,成功(匹配空字符串)并再次用r
替换它。如果您不允许空匹配,则“困惑”行为将消失:在Python3.7之前的版本中,如果
re.sub
使用了整个字符串,那么它将不会再次尝试在末尾进行匹配,而在Python3.7+中则会这样做。更具体地说,引用re.sub
的文档:Python 3.7+(一致的行为)
Python 3.6(不一致行为)
相关问题 更多 >
编程相关推荐