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)]
我的推理:
[+-]?\s*[0-9]+
允许可选的正号或负号(但只有一个)加上可选的空格(需要 none)和 0-9 的数字(至少需要一个)。这定义了我的第一组
(?:\.[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\2
。
您进行了不必要的分组。结果是您想要的模式的不同部分,您只想找到它们,而不是替换它们。
您假设 C 或 F 总是出现在行尾。
你多了一个括号。
我不是专家,所以可能还有其他问题。
N。 B. 使用在线翻译会有所帮助,因为他们 show/highlight 一些错误。
我从你的模式开始,想出了下面的模式:
[+-]?\s*[0-9+][\.]?[0-9+]?\s*[CF]
这里有一个 regex demo 也提供了上面模式的详细解释。您可以在此处粘贴第一个模式以获得比我提供的更好的解释。
我正在做一个练习来创建一个用温度过滤字符串的正则表达式。
我们的想法是捕获所有具有诸如“-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]+
允许可选的正号或负号(但只有一个)加上可选的空格(需要 none)和 0-9 的数字(至少需要一个)。这定义了我的第一组(?:\.[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\2
。您进行了不必要的分组。结果是您想要的模式的不同部分,您只想找到它们,而不是替换它们。
您假设 C 或 F 总是出现在行尾。
你多了一个括号。
我不是专家,所以可能还有其他问题。
N。 B. 使用在线翻译会有所帮助,因为他们 show/highlight 一些错误。
我从你的模式开始,想出了下面的模式:
[+-]?\s*[0-9+][\.]?[0-9+]?\s*[CF]
这里有一个 regex demo 也提供了上面模式的详细解释。您可以在此处粘贴第一个模式以获得比我提供的更好的解释。