正向预查长度指定的正确语法?stringr提取数字后字符串报错求助
提取字符串开头数字后的部分(R语言stringr解决方案)
你需要处理开头为任意长度数字的字符串,目标提取数字后的剩余内容,比如从c("14ac", "148me3")得到c("ac", "me3")。
之前尝试的问题分析
- 第一次用
(?<=\\d+).*失败:因为stringr依赖的ICU正则引擎要求正向预查(lookbehind)的匹配长度必须有明确上限,\\d+是无上限的量词,不符合要求。 - 第二次用
(?<=\\d{1, 10}).*失败:问题出在正则区间的写法——{1, 10}里逗号后面多了空格,ICU正则不允许区间的逗号和数字之间有空格,必须写成{1,10}。
正确的解决方案
方案1:修正lookbehind的区间写法
如果确定开头数字的最大长度不超过某个值(比如10位),可以保留lookbehind的写法,去掉区间里的空格:
library(stringr) xx <- c("14ac", "148me3") str_extract(xx, "(?<=\\d{1,10}).*") # 输出结果:[1] "ac" "me3"
方案2:更通用的无长度限制写法(推荐)
如果无法确定数字的最大长度,推荐使用以下两种不依赖lookbehind的方法,更灵活:
- 用
str_replace替换开头数字为空:
str_replace(xx, "^\\d+", "") # 输出结果:[1] "ac" "me3"
这里^\\d+匹配字符串开头的一或多个数字,直接替换为空就得到剩余内容。
- 用
str_match捕获数字后的内容:
str_match(xx, "^\\d+(.*)")[, 2] # 输出结果:[1] "ac" "me3"
^\\d+(.*)中,(.*)捕获数字后的所有内容,str_match返回的矩阵中第二列就是捕获到的目标内容。
内容的提问来源于stack exchange,提问作者Pavel Shliaha
相关产品推荐
相关产品推荐

