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])$)定义第二组。根据此[文本](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwjTj5iqlc3nAhVIlKwKHXNqBOgQFjAAegQIARAB&url=http%3A%2F%2Fxlb.es%2FMastering%2520Regular%2520Expressions%2520(Friedl-2006).pdf&usg = AOvVaw3-cnSkc9JkyvCtAxWyQLYy),(?:表示在括号中可以有一个可选组的符号。在这种情况下,\。[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.