我有一个“字母数字”形式的字符串向量,我想使用
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 用户可以澄清幕后发生的事情。
我理解为“匹配任意数量的连续数字字符”。
任何数字包括零。它将在模式成功的第一个位置匹配。因为
\d*
可以成功匹配零位数字,所以它永远不会查找字符串开头以外的任何地方。如果那里没有数字,那么你会得到""
。
最有可能的是,您需要
\d+
,它匹配 一个或多个 数字。然后,匹配将在没有任何数字的位置失败,您将获得字符串中的第一串数字。
但是
\d*$
在情况 4 中对你有用,因为它再次寻找 first position 其中有零个或多个数字后跟字符串结尾。它可以匹配字符串末尾的零位数字,但它没有机会匹配,因为它在找到字符串末尾的位置之前找到了 42
之前的位置。在情况 5 中,字符串末尾没有数字,因此它必须等到末尾,才能成功匹配零数字。