我有一个字符串的形式“字母数字”的向量,我想使用在stringr::str_extract
中实现的RegEx模式"\\d*"
提取数字。结果非常令人困惑:
# R 4.2.3
# install.packages('stringr')
library(stringr)
# case 1
str_extract('word 42', '\\d*')
# ""
# case 2 (?)
str_extract('42 word', '\\d*')
# "42"
# case 3
str_extract('word 42', '\\d+')
# "42"
# case 4 (?!)
str_extract('word 42', '\\d*$')
# "42"
# case 5
str_extract('42 word', '\\d*$')
# ""
在所有情况下,预期的结果都是"42"
。我是RegEx的新手,但pattern = '\\d*'
似乎很简单-我将其理解为“匹配任何数量的连续数字字符”。
事实上,它对情况1不起作用,但对情况2起作用,这本身就很违反直觉。然后,当使用pattern = '\\d*$'
时,角色似乎颠倒了(情况4和5)。
我已经尝试了更多的其他功能(str_match
和str_match_all
),但结果仍然不清楚。
我在其他地方找不到这样一个具体的东西,所以我希望更有经验的R/RegEx用户可以澄清一下到底发生了什么。
1条答案
按热度按时间fkaflof61#
我将其理解为“匹配任意数量的连续数字字符”。
任何数字 * 包括零 *。并且它将在模式成功的 * 第一个位置 * 匹配。因为
\d*
可以成功匹配零位数,所以它永远不会查找字符串开头以外的任何地方。如果那里没有数字,那么您将得到""
。最有可能的情况是,您需要
\d+
,它匹配 * 一个或多个 * 数字。然后,匹配将在没有任何数字的位置失败,您将获得字符串中的第一个数字串。但是
\d*$
在第4种情况下也适用,因为它同样在寻找 * 第一个位置 *,其中有零个或多个数字后跟字符串的结尾。它可以匹配字符串结尾的零个数字,但是它没有机会这样做,因为它在找到字符串末尾的位置之前就找到了42
之前的位置。在情况5中,字符串的末尾没有数字,因此它必须等待直到末尾,在那里它可以成功匹配零位。