gpt4 book ai didi

行为异常的 Python 正则表达式

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:29 24 4
gpt4 key购买 nike

url = "http://www.domain.com/7464535"
match = re.search(r'\d*',url)
match.group(0)

返回 '' <----- 空字符串

但是

url = "http://www.domain.com/7464535"
match = re.search(r'\d+',url)
match.group(0)

返回“7464535”

我认为“+”应该是 1 或更多,而“*”应该是 0 或更多? RE 应该是贪婪的。那么,为什么它们不返回相同的东西,更重要的是,为什么第一个不返回任何东西?

最佳答案

你对 +* 的含义是正确的。所以 \d* 将匹配零个或多个数字——这正是它正在做的。从字符串的开头开始,它匹配零位数字,然后就完成了。它成功匹配了零个或多个数字。

* 是贪婪的,但这仅意味着它会在匹配的地方匹配尽可能多的数字。它不会放弃匹配以尝试在字符串中稍后找到更长的匹配。


编辑:更详细地描述正则表达式引擎的作用:

假设我们要搜索的字符串是 "http://www.domain.com/7464535" 并且模式是 \d+

一开始,正则表达式引擎指向我们 URL 的开头和正则表达式模式的开头。 \d+ 需要匹配一个或多个数字,因此正则表达式引擎首先必须找到至少一个数字才能成功匹配。

它首先查找的地方是一个“h”字符。那不是数字,所以它移动到“t”,然后是下一个“t”,依此类推,直到最后到达“7”。现在我们已经匹配了一个数字,所以满足了“一个或多个”的要求,我们可以有一个成功的匹配,除了 + 是贪婪的,所以它会匹配尽可能多的在不更改匹配项“7”的起点 的情况下,尽可能减少数字。所以它到达字符串的末尾并匹配整数“7464535”。

现在考虑我们的模式是否是\d*。现在唯一的区别是零数字是有效匹配。由于正则表达式从左到右匹配,因此 \d* 将匹配的第一个位置是字符串的开头。所以我们一开始有一个零长度的匹配,但是由于 * 是贪心的,所以只要有数字它就会扩展匹配。由于我们找到的第一件事是“h”,一个非数字,它只返回零长度匹配。

如果 * 只是给你一个零长度的匹配,那它还有什么用呢?考虑一下我是否正在匹配这样的配置文件:

foo: bar
baz: quux
blah:blah

我想在冒号后允许任意数量的空格(甚至零)。我会使用像 (\w+):\s*(\w+) 这样的正则表达式,其中 \s* 匹配零个或多个空格。由于它出现在模式中的冒号之后,它将匹配字符串中的冒号之后,然后匹配零长度字符串(如第三行 blah:blah 因为 'b'在冒号结束匹配之后)或下一个非空格之前的所有空格,因为 * 是贪婪的。

关于行为异常的 Python 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15713712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com