我正在尝试在“R”中创建一个正则表达式来为我捕获两组字符,我似乎无法弄清楚它为什么不起作用。
这是我想要实现的目标......
从这个字符串:
"air.BattleofZombies 0.0008 0.0006 -0.0027"
我想回复:
"air.BattleofZombies=0.0008 0.0006 -0.0027"
相反,这是我得到的:
"air.BattleofZombie= 0.0008 0.0006 -0.0027="
我的正则表达式查询是:
gsub("([^\\s]*)[\\s]*([-?\\d*\\.?\\d*\\s*]*)","\\1=\\2", "air.BattleofZombies 0.0008 0.0006 -0.0027")
欢迎任何帮助。
答案 0 :(得分:2)
我发现字符类更容易使用。 (我认为@Simon错误的是" \ s"会匹配。)
> tst <- "air.BattleofZombies 0.0008 0.0006 -0.0027"
> sub("[ ]{2,}", "=", tst)
[1] "air.BattleofZombies=0.0008 0.0006 -0.0027"'
请参阅?regex页面并注意这句话:&#34;符号\ d,\ s,\ D和\ S表示数字和空格类及其否定。&#34;尽管如此,我发现即使没有字符类机制,文字空间" "
也常常起作用。 (我无法评论删除的帖子,但我现在看到这是@KaraWoo之前发布的相同答案,并且它没有提供所需结果的唯一原因是使用了gsub。)< / p>
答案 1 :(得分:2)
另一个简短的解决方案:
vec <- "air.BattleofZombies 0.0008 0.0006 -0.0027"
sub("\\s+", "=", vec)
# [1] "air.BattleofZombies=0.0008 0.0006 -0.0027"
答案 2 :(得分:1)
我认为有几个问题需要解决。首先,字符类中的\\s
(即[]
内)与s
匹配,而不是空格,除非使用perl=T
(所以我只用空格替换它) )。其次,gsub()
多次替换,因此我将其替换为sub()
。另外,第二组括号中的字符类将更好地作为括号。以下正则表达式解决了这个问题:
sub("([^ ]*) +((-?\\d*\\.?\\d* *)*)","\\1=\\2", "air.BattleofZombies 0.0008 0.0006 -0.0027",1)
[1] "air.BattleofZombies=0.0008 0.0006 -0.0027"
答案 3 :(得分:1)
只需将起始([^\\s]*)
转为([^\\s]+)
,因为您使用的正则表达式也必须捕获空字符串并删除字符类中的所有*
,因为*
里面的字符类会失去他的特殊含义,只匹配文字*
。因此,请将[\\d*\\s*\\.]
转为[\\d\\s.]
> gsub("([^\\s]+)\\s*([-\\d.\\d\\s]*)", "\\1=\\2", x, perl=T)
[1] "air.BattleofZombies=0.0008 0.0006 -0.0027"
或强>
> gsub("(\\S+)\\s*((-?\\d+(?:\\.\\d+)?)(?:\\s+(?3))*)", "\\1=\\2", x, perl=T)
[1] "air.BattleofZombies=0.0008 0.0006 -0.0027"
(?3)
递归第三个捕获组内的模式。下面给出了这个正则表达式易于理解的形式。
或强>
> gsub("(\\S+)\\s+(-?\\d+(?:\\.\\d+)?(?:\\s+-?\\d+(?:\\.\\d+)?)*)", "\\1=\\2", x, perl=T)
[1] "air.BattleofZombies=0.0008 0.0006 -0.0027"