我有一个"字母数字"形式的字符串向量,我想使用在stringr::str_extract中实现的模式"\\d*"的RegEx来提取数字.结果非常令人困惑:

# 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‘s的新手,但pattern = '\\d*'似乎非常简单--我把它理解为"匹配任意数量的连续数字字符".

它不适用于第一种情况,但适用于第二种情况,这一事实本身就非常违反直觉.然后,当使用pattern = '\\d*$'时,角色似乎颠倒了(情况4和5).

我已经try 了更多的其他函数(str_matchstr_match_all),但结果仍然不清楚.

我在其他地方找不到这样具体的东西,所以我希望更有经验的R/RegEx用户能够澄清到底发生了什么.

推荐答案

我把它理解为"匹配任意数量的连续数字字符".

任何数字including zero.并且它将在模式成功的first position处匹配.因为\d*可以成功地匹配零数字,所以它永远不会查找字符串开头以外的任何地方.如果那里没有数字,那么你会得到"".

最有可能的是,你想要\d+,这与one or more位数字相匹配.然后,匹配将在没有任何数字的位置失败,您将获得字符串中的第一个数字字符串.

\d*$在 case 4中也适用,因为它同样会查找first position,其中有零个或多个数字,后跟字符串尾.它可以匹配字符串末尾的零个数字,但它没有机会这样做,因为它在找到字符串末尾的位置之前,先找到42之前的位置.在情况5中,字符串末尾没有数字,因此它必须等到末尾,在那里它可以成功匹配零个数字.

R相关问答推荐

如何 bootstrap glm回归、估计95%置信区间并绘制它?

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

为什么当用osmdata映射R时会得到相邻状态?

如何计算多个日期是否在一个日期范围内

为什么我的基准测试会随着样本量的增加而出现一些波动?

如何删除最后一个可操作对象

R:从geom_ol()中删除轮廓并导出为pdf

为什么我使用geom_density的绘图不能到达x轴?

如何在R中平滑地绘制线图(不拟合)?

QY数据的处理:如何定义QY因素的水平

如何使这些react 表对象相互独立?

如何使用For-R循环在向量中找到一系列数字

在R中,如何从一系列具有索引名的变量快速创建数据帧?

如何在R中使用混合GAM模型只对固定的影响因素进行适当的预测?

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

R仅当存在列时才发生变异

使用geom_sf跨越日期线时的闭合边界

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

图中显示错误 colored颜色 的图例geom_sf

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出