给出字符串ab cd ; ef gh ij
,我如何删除;
之后第一个空格之后的所有空格,即ab cd ; efghij
?我尝试使用\K
,但无法使其完全正常工作。
test = 'ab cd ; ef gh ij'
gsub('(?<=; )[^ ]+\\K +','',test,perl=T)
# "ab cd ; efgh ij"
答案 0 :(得分:4)
1)gsubfn 这是在gsubfn软件包中使用gsubfn
的一种单行代码,仅使用简单的正则表达式。它将捕获组输入到指定的函数中(用公式表示法表示),然后将匹配项替换为该函数的输出。
library(gsubfn)
gsubfn("; (.*)", ~ paste(";", gsub(" ", "", x)), test)
## [1] "ab cd ; efghij"
2)gsub :此模式使用的模式由空格组成,该空间不以分号开头,而在字符串的其余任何地方不以分号结尾。
gsub("(?<!;) (?!.*; )", "", test, perl = TRUE)
## [1] "ab cd ; efghij"
3)regexpr / substring 这将找到分号的位置,然后使用substring
将其分成两部分,并用gsub
替换空格,最后将其粘贴回去
ix <- regexpr(";", test)
paste(substring(test, 1, ix), gsub(" ", "", substring(test, ix + 2)))
## [1] "ab cd ; efghij"
4)read.table (读表)。这类似于(3),但使用read.table
将输入分为两个字段。
with(read.table(text = test, sep = ";", as.is = TRUE), paste0(V1, "; ", gsub(" ", "", V2)))
## [1] "ab cd ; efghij"
答案 1 :(得分:3)
我肯定有一个正则表达式解决方案(我希望有人发布),但这是一个非正则表达式解决方案,它依靠分号保持一致。如果有多个分隔符,则可以对其进行调整。希望对您有所帮助!
> # Split the string on the semi-colon (assumes semi-colon is consistent)
> split <- strsplit(c("ab cd ; ef gh ij", "abcd e f ; gh ij k"), ";")
>
> # Extract elements separately
> pre_semicolon <- sapply(split, `[`, 1)
> post_semicolon <- sapply(split, `[`, 2)
>
> # Remove all spaces from everything after the semi-colon
> post_semicolon <- gsub("[[:space:]]", "", post_semicolon)
>
> # Paste them back together with a semi-colon and a space
> paste(pre_semicolon, post_semicolon, sep = "; ")
[1] "ab cd ; efghij" "abcd e f ; ghijk"