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

问题描述 投票:1回答:2

我正在做一个练习来创建一个正则表达式,该正则表达式会根据温度过滤字符串。

想法是捕获所有具有以下结构的东西:“-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])$)定义第二组。根据此text(?:表示打开括号,其中可以有一个可选组。在这种情况下,\\.[0-9]*)?是可选组(小数点和一些数字)。然后,\\s+定义空格(不需要),([CF])$是字符串的结尾(强制性)。

[如果我做得很好,我有两个正则表达式组,这就是为什么我使用\\1\\2反向引用。我的代码不起作用,因此得到character(0)

r regex string grepl
2个回答
1
投票

您可以尝试:

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。


1
投票

推荐模式:

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

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。使用联机解释器在这里会很有帮助,因为它们会显示/突出显示某些错误。

我从您的模式开始,并提出以下一种:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.