需要正则表达式逻辑

时间:2016-09-29 08:41:40

标签: r regex

我有一个矢量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)

2 个答案:

答案 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中,然后.*匹配字符串的其余部分。