【问题标题】:Regular Expression to remove a letter and dot combination删除字母和点组合的正则表达式
【发布时间】:2018-04-20 03:18:59
【问题描述】:

我正在尝试在 R 中使用正则表达式来删除文本——“X”或“X”。 - 从数字的前面。我是正则表达式的新手,很难让它工作。我已经尝试过 X 和 .有或没有我能想到的转义字符,包括:

  • str_replace("X.4.89294e-05", "X.",'') 结果 "4.89294e-05" 但对于 str_replace("X4.89294e-05", "X.",'')Result ".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"

任何帮助将不胜感激。

【问题讨论】:

  • 正斜杠/没什么特别的,转义字符是反斜杠\。通常,对于 R 中的正则表达式,您需要 2 个反斜杠(一个用于 R 本身,一个用于正则表达式)。

标签: r regex str-replace


【解决方案1】:

. 必须转义。在 R 中,您可以通过在 . 运算符之前添加 \\ 来做到这一点。

在此处阅读\\ 的需求:Escape with a double backslash

像这样:

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

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

【讨论】:

  • Arg - 我试过这个组合,但当然会混淆/ 和`\` 会做到的!谢谢!
  • 如果您解释为什么它是 \\. 这将是一个更好的答案。而不仅仅是 \.
  • 我添加了对关于该主题的另一个 SO 线程的引用。它的解释比我以往任何时候都好。
【解决方案2】:

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

【讨论】:

  • 需要双重转义,一次用于R,一次用于正则表达式。 "X\\."
  • 谢谢,不熟悉R,只是正则表达式的常见情况
【解决方案3】:

删除文本 - “X”或“X”。 - 从数字前面开始

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

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

请注意,在正则表达式测试站点,您需要使用单个反斜杠(literal 反斜杠),该反斜杠在 R 字符串文字中使用双反斜杠“编码”。

详情

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

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

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

那么,没有必要使用\1,因为与前瞻匹配的文本没有被放入匹配中,因此在sub/str_replace操作期间不会被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多