R 中的这个正则表达式模式有什么问题?

What is wrong with this regex pattern in R?

我正在做一个练习来创建一个用温度过滤字符串的正则表达式。

我们的想法是捕获所有具有诸如“-0.4 F”、“5 C”、“- 0.6 C”等结构的。这是我的尝试:

temp <- c("La temp es de 0.4 F", "La temp es de -5F", "nada", "tampoco nada",
    "La temp es de - 0.6    C")

temp[grepl("([+-]?\s+[0-9]+(?:\.[0-9]*)?)\s+([CF])$)\1\2", temp)]

我的推理:

  1. [+-]?\s*[0-9]+ 允许可选的正号或负号(但只有一个)加上可选的空格(需要 none)和 0-9 的数字(至少需要一个)。这定义了我的第一组
  2. (?:\.[0-9]*)?)\s+([CF])$) 定义第二组。根据此 text(?: 符号代表左括号,其中可以有一个可选组。在这种情况下,\.[0-9]*)? 是可选组(小数点和一些数字)。然后,\s+ 定义空格(需要 none),([CF])$ 是字符串的结尾(强制)。

如果我推理得很好,我有两个正则表达式组,这就是我使用 \1\2 反向引用的原因。我的代码不起作用,所以我得到 character(0) 作为结果。

你可以试试:

grep('-?\d+(\.\d+\s+)?[CF]', temp, value = TRUE)
#[1] "La temp es de 0.4 F" "La temp es de -5F"  "La temp es de - 0.6    C"

-? - 是一个可选的负号

\d+ - 后跟一个或多个数字

(\.\d+\s+)? - 带有可选的十进制数和空格

[CF] - 后跟 C 或 F。

推荐模式:

如果是我从头开始,我会使用以下内容:

grep('\d[^a-z]*[CF]', temp, value = TRUE)


 # > [1] "La temp es de 0.4 F"      "La temp es de -5F"        "La temp es de - 0.6    C"

\d有个数字

[^a-zA-Z]* 后跟的不是 a-z 范围内的任何字符,而是任何其他字符

[CF] 并在末尾跟 C 或 F

解释:

你的正则表达式有很多问题(如果我没记错的话):

  1. 您在替换中使用了组,而不是在匹配模式中。我不确定为什么你的模式末尾有 \1\2

  2. 您进行了不必要的分组。结果是您想要的模式的不同部分,您只想找到它们,而不是替换它们。

  3. 您假设 C 或 F 总是出现在行尾。

  4. 你多了一个括号。

我不是专家,所以可能还有其他问题。

N。 B. 使用在线翻译会有所帮助,因为他们 show/highlight 一些错误。

我从你的模式开始,想出了下面的模式:

[+-]?\s*[0-9+][\.]?[0-9+]?\s*[CF]

这里有一个 regex demo 也提供了上面模式的详细解释。您可以在此处粘贴第一个模式以获得比我提供的更好的解释。