【发布时间】:2017-08-11 10:22:40
【问题描述】:
我想gsub R 中的字符串中提到的维度模式。例如:
"16 x 13 x 12 inch box"
"1x2x3 pipe"
"123x 23 x334 asd"
预期输出:
"inch box"
"pipe"
"asd"
到目前为止我得到的是这个表达式:[0-9]*\\s*x\\s*。如何使它成为重复的模式匹配?
【问题讨论】:
我想gsub R 中的字符串中提到的维度模式。例如:
"16 x 13 x 12 inch box"
"1x2x3 pipe"
"123x 23 x334 asd"
预期输出:
"inch box"
"pipe"
"asd"
到目前为止我得到的是这个表达式:[0-9]*\\s*x\\s*。如何使它成为重复的模式匹配?
【问题讨论】:
模式的一部分可以用量词重复。如果您需要量化一组模式,请使用分组构造并将量词应用于构造。
你可以使用
sub("^[0-9]+(?:\\s*x\\s*[0-9]+)+\\s*", "", x)
详情
^ - 字符串的开头[0-9]+ - 1 位或多位数字(?: - 匹配以下连续子模式的非捕获组的开始:
\\s* -0+ 空格x - 一个x
\\s* -0+ 空格[0-9]+)+ - ...1 次或更多次\\s* -0+ 空格。见R demo:
x <- c("16 x 13 x 12 inch box", "1x2x3 pipe", "123x 23 x334 asd")
sub("^[0-9]+(?:\\s*x\\s*[0-9]+)+\\s*", "", x)
## => [1] "inch box" "pipe" "asd"
【讨论】:
我们可以使用sub 来匹配字符 (.*) 后跟一个或多个数字 (\\d+) 后跟空格 (\\s+) 并将其替换为空白 (")
sub(".*\\d+\\s+", "", v1)
#[1] "inch box" "pipe" "asd"
【讨论】:
另一种正则表达式,将数字“\d”和“x”分组,允许缺少某些字符与“?”以及用“*”丢失最后一位数字的可能性,用“()+”包装这个模式允许模式无限重复。
sub("(\\d+ ?x ?\\d* ?)+", "", x)
[1] "inch box" "pipe" "asd"
【讨论】: