首页 > 解决方案 > 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]+允许可选的正号或负号(但只有一个)加上可选的空格(不需要)和 0-9 的数字(至少需要一个)。这定义了我的第一组
  2. (?:\\.[0-9]*)?)\\s+([CF])$)定义第二组。根据这个文本(?:符号代表可以有一个可选组的左括号。在这种情况下,\\.[0-9]*)?是可选组(十进制句点和一些数字)。然后,\\s+定义空格(不需要)并且([CF])$是字符串的结尾(强制)。

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

标签: rregexstringgrepl

解决方案


推荐模式:

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

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]*后面不是 az 范围内的任何字符,而是任何其他字符

[CF]最后是 C 或 F

解释:

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

  1. 您在替换中使用组而不是在匹配模式中。我不知道你为什么\\1\\2在你的模式结束时有。

  2. 你有不必要的分组。你想要的模式的不同部分是随之而来的,你只想找到它们,而不是替换它们。

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

  4. 你有一个额外的括号。

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

注意使用在线解释器在这里会很有帮助,因为它们会显示/突出一些错误。

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

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

这是一个正则表达式演示,它还提供了上述模式的详细说明。您可以在此处粘贴第一个模式以获得比我提供的更好的解释。


推荐阅读