我遇到了一个看似简单的问题,但我发现的解决方案并不令人满意。我想用逗号替换任何句号后跟一个数字。例如,
strings <- c("22.222.222", "12.323", "don.t replace")
将成功转换为
[1] "22,222,222" "12,323" "don.t replace"
我尝试的第一个解决方案是
str_replace_all(strings,
"(?<=\\d+)\\.",
",")
但是我收到以下错误消息:
Error in stri_replace_all_regex(string, pattern, replacement, vectorize_all = vec, :
Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT)
当我使用
时str_replace_all(strings,
"(?<=\\d{1,3})\\.",
",")
我得到了正确的转变。但是,硬编码的1-3位数字不是我想要的,我不明白为什么\\d+
不起作用,\\d{1,3}
不起作用。
答案 0 :(得分:2)
不需要+
量词,你关心的只是匹配序列中的最后一位数。所以只需将\d
放在后面。
str_replace_all(strings,
"(?<=\\d)\\.",
",")
答案 1 :(得分:2)
这里不需要任何外观,因为数字是已知的子模式,并且您不需要任何重叠匹配。只需在数字周围使用捕获组,然后使用反向引用将其恢复到结果中:
> library(stringr)
> strings <- c("22.222.222", "12.323", "don.t replace")
> str_replace_all(strings, "(\\d+)\\.", "\\1,")
[1] "22,222,222" "12,323" "don.t replace"
或使用基础R gsub
:
> gsub("(\\d+)\\.", "\\1,", strings)
[1] "22,222,222" "12,323" "don.t replace"
请参阅regex demo
请注意,(?<=\\d{1,3})
约束宽度后视效果正常,因为 stringr 正则表达式的风格为ICU。如果可以预先计算后视图中的图案长度,那么它将起作用,因此具有最小值和最大值的限制量词可以正常工作。它不适用于perl=T
的PCRE(gsub
)regexp。无限宽度的lookbehind(里面有+
和*
量词)只支持几种风格:Python PyPi正则表达式模块,.NET,RegexBuddy工具,Vim。