正则表达式删除字母和点组合

时间:2018-04-20 03:18:59

标签: r regex str-replace

我试图在R中使用正则表达式来删除文本 - “X”或“X”。 - 从一个数字的前面。我是正则表达式的新手,并且很难让它工作。我尝试了X和的每个组合。有或没有我能想到的逃脱角色,包括:

  • str_replace("X.4.89294e-05", "X.",'')结果"4.89294e-05"str_replace("X4.89294e-05", "X.",'')结果".89294e-05"
  • 失败
  • str_replace("X.4.89294e-05", "[X.]",'')结果".4.89294e-05"
  • str_replace("X.4.89294e-05", "[X/.?]",'')结果".4.89294e-05"
  • str_replace("X.4.89294e-05", "[X//.?]",'')结果".4.89294e-05"
  • str_replace('X.4.89294e-0','X/.{0,1}','')结果"X.4.89294e-0"
  • str_replace('X.4.89294e-0','[X/.{0,1}]','')结果".4.89294e-0"

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:9)

必须转义.。在R中,您可以通过在\\运算符之前添加.来实现此目的。

在此处了解\\的需求:Escape with a double backslash

像这样:

txt = c("X.4.89294e-0", "X4.89294e-0")
str_replace(txt, "^X(\\.)?", "")

如果您不想在一开始就专门匹配XX.,请从上面的示例中移除^,以便在该字词的任何位置与其匹配。

答案 1 :(得分:2)

你的意思是删除' X'或者' X。'从任何数字?
实际上,正则表达式中的单个.应该与此\.类似,因此请尝试使用str_replace("X.4.89294e-05", "X\.?", "")

答案 2 :(得分:2)

  

删除文字 - ' X'或者是' X。' - 从数字前面

考虑到所有测试用例在字符串的开头都包含一个XX.,您可以使用

sub("^X\\.?(\\d)", "\\1", x)
str_replace(x, "^X\\.?(\\d)", "\\1")

请注意,在正则表达式测试网站上,您需要使用单个反斜杠(文字反斜杠),即#34;编码"使用R字符串文字中的双反斜杠。

<强>详情

  • ^ - 字符串的开头
  • X - X字符
  • \\.? - \.匹配文字点,?是一个量词,使正则表达式引擎匹配.字符连续出现1或0次
  • (\\d) - 一个捕获组#1,匹配并在内存插槽中存储任何数字(\d匹配任何数字)
  • \\1 - 在替换参数内,对存储在第1组内存插槽中的值的引用。

您甚至可以使用(?=\d)基于前瞻的解决方案来检查当前位置右侧的数字:

sub("^X\\.?(?=\\d)", "", x, perl=TRUE)
str_replace(x, "^X\\.?(?=\\d)", "")

然后,无需使用\1,因为与前瞻匹配的文字未放入匹配中,因此在sub / {{1}期间无法删除操作。

相关问题