r - 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)]
我的推理:
[+-]?\\s*[0-9]+
允许可选的正号或负号(但只有一个)加上可选的空格(不需要)和 0-9 的数字(至少需要一个)。这定义了我的第一组(?:\\.[0-9]*)?)\\s+([CF])$)
定义第二组。根据这个文本,(?:
符号代表可以有一个可选组的左括号。在这种情况下,\\.[0-9]*)?
是可选组(十进制句点和一些数字)。然后,\\s+
定义空格(不需要)并且([CF])$
是字符串的结尾(强制)。
如果我推理得当,我有两个正则表达式组,这就是我使用\\1\\2
反向引用的原因。我的代码不起作用,所以我得到character(0)
了结果。
解决方案
推荐模式:
如果是我从头开始,我会使用以下内容:
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\\2
在你的模式结束时有。你有不必要的分组。你想要的模式的不同部分是随之而来的,你只想找到它们,而不是替换它们。
您假设 C 或 F 总是出现在行尾。
你有一个额外的括号。
我不是专家,所以可能还有其他问题。
注意使用在线解释器在这里会很有帮助,因为它们会显示/突出一些错误。
我从你的模式开始,想出了下面的模式:
[+-]?\\s*[0-9+][\\.]?[0-9+]?\\s*[CF]
这是一个正则表达式演示,它还提供了上述模式的详细说明。您可以在此处粘贴第一个模式以获得比我提供的更好的解释。
推荐阅读
- python-3.x - 读取多个excel文件并对其应用清理过程
- r - 堆积柱形图出现而不是使用ggplot闪避
- python - 使用 smtp 从列表发送邮件
- ruby-on-rails - 为多租户 Rails 应用程序建模,使其易于维护
- ios - xcode 在上传期间在错误的路径中引用 itmsTransporter
- html - 如何从我的页面中删除一个大的空白区域?
- javascript - 在没有键的情况下循环 Map JavaScript
- java - 有没有办法从 Oracle 中选择记录并锁定它们以避免被另一个请求读取?
- java - do-while 循环计算输入数字中的位数。故障排除代码
- bash - 如何编写带有条件的嵌套 bash 循环