我有这样的字符串:
a <- "this string has an even number of words"
b <- "this string doesn't have an even number of words"
我想用新线替换所有其他空间。所以输出看起来像这样......
myfunc(a)
# "this string\nhas an\neven number\nof words"
myfunc(b)
# "this string\ndoesn't have\nan even\nnumber of\nwords"
我通过对偶数字进行strsplit
,paste
- 换行来完成此操作,然后paste(a, collapse=" ")
将它们组合成一个字符串。是否有与gsub
一起使用的正则表达式可以实现此目的?
答案 0 :(得分:5)
@Jota提出了一种简单明了的方法:
myfunc = function(x) gsub("( \\S+) ", "\\1\n", x) # Jota's
myfunc2 = function(x) gsub("([^ ]+ [^ ]+) ", "\\1\n", x) # my idea
lapply(list(a,b), myfunc)
[[1]]
[1] "this string\nhas an\neven number\nof words"
[[2]]
[1] "this string\ndoesn't have\nan even\nnumber of\nwords"
它是如何工作的。 "([^ ]+ [^ ]+) "
正则表达式的概念是(1)“找到两个单词/非空格序列,它们之间有空格,后面有空格”和(2) “用换行符替换尾随空格”。
@ Jota的"( \\S+) "
比较棘手 - 它找到任何带有前后空格的单词,然后用换行符替换尾随空格。这是有效的,因为它捕获的第一个单词是字符串的第二个单词;并且由它捕获的下一个词不是第三个(因为我们已经“消耗”/查看处理第二个单词时第三个单词前面的空格),而是第四个单词;等等。
哦,还有一些基本的正则表达式。
[^xyz]
表示除了字符x,y和z之外的任何单个字符。\\s
是一个空格,而\\S
只是一个空格x+
表示x
一次或多次(x)
“捕获”x
,允许在替换中引用,例如\\1