在数字

时间:2016-03-07 21:51:14

标签: regex r stringr

我遇到了一个看似简单的问题,但我发现的解决方案并不令人满意。我想用逗号替换任何句号后跟一个数字。例如,

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}不起作用。

2 个答案:

答案 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。