我有一个矢量a如下:
a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]")
需要回答如下:
a应该有Rs.360, Rs.213, Rs.430
我用过:
a <- gsub(" Rs*", "", a)
答案 0 :(得分:5)
正如我在评论中所说,如果你总是拥有相同的模式(相同的位数),你可以使用substr
来提取字符串的开头。如果您愿意,可以进一步抑制空格:
substr(a, 1, 7)
[1] "Rs. 360" "Rs. 213" "Rs. 430"
sub(" ", "", substr(a, 1, 7))
[1] "Rs.360" "Rs.213" "Rs.430"
或者你可以在字符串中捕获你想要的模式,并形成另一个字符串:
gsub("^[A-Za-z.]{3} (\\d{3}).+", "Rs.\\1", a)
[1] "Rs.360" "Rs.213" "Rs.430"
在这里,您只会捕获3位数字,并明确地回复Rs.
。
或者你可以&#34;擦除&#34;你不想要的一切:空间和你想要保留的模式之后的所有东西:
gsub("(\\s)|([A-Za-z0-9. ]{8}\\s\\[-*\\d+%\\s*\\])", "", a)
[1] "Rs.360" "Rs.213" "Rs.430"
在这里,您指定要抑制空格(\\s
)和/或8个字母数字或字母或空格,后跟空格,左括号,无或减号,一个以上的数字,%符号,没有任何东西或空格,最后是一个结束括号。
答案 1 :(得分:3)
您可以使用正则表达式捕获组,这些组将抓取您需要的部分,并在替换模式中使用反向引用,您可以将它们插回到结果中:
sub("^\\s*(Rs\\.)\\s*(\\d+).*", "\\1\\2", a)
请参阅regex demo
正则表达式匹配:
^
- 字符串开头\\s*
- 零个或多个空格(Rs\\.)
- 第1组捕获Rs.
序列\\s*
- 0+ whitespaces (\\d+)
- 第2组获取1个或多个数字.*
- 字符串的其余部分到底经过测试的代码:
> a <- c("Rs. 360 Rs. 540 [-33% ]", "Rs. 213 Rs. 250 [-15% ]", "Rs. 430 Rs. 1030 [-58% ]")
> sub("^\\s*(Rs\\.)\\s*(\\d+).*", "\\1\\2", a)
[1] "Rs.360" "Rs.213" "Rs.430"
<强>更新强>
对于a <- c(" 360 540", " 213 250")
之类的输入,请使用sub("^\\D*(\\d+).*", "\\1", a)
。
> a <- c(" 360 540", " 213 250")
> sub("^\\D*(\\d+).*", "\\1", a)
[1] "360" "213"
^\\D*(\\d+).*
匹配字符串开头的任意数量的非数字符号,然后将1+个数字捕获到组1中,然后.*
匹配字符串的其余部分。