R:正则表达式捕获给定字符后的所有实例
R: regex to capture all instances after a given character
给定字符串 ab cd ; ef gh ij
,如何删除 ;
之后第一个 space 之后的所有 space,即 ab cd ; efghij
?我尝试使用 \K
但无法完全正常工作。
test = 'ab cd ; ef gh ij'
gsub('(?<=; )[^ ]+\K +','',test,perl=T)
# "ab cd ; efgh ij"
我确信有一个正则表达式解决方案(我希望有人发布),但这里有一个非正则表达式解决方案,它依赖于分号的一致性。如果有多个分隔符,您可以对其进行调整。希望它有所帮助!
> # 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"
1) gsubfn 在 gsubfn 包中使用 gsubfn
,这是一个仅使用简单正则表达式的单行代码。它将捕获组输入指定的函数(以公式表示法表示)并用函数的输出替换匹配项。
library(gsubfn)
gsubfn("; (.*)", ~ paste(";", gsub(" ", "", x)), test)
## [1] "ab cd ; efghij"
2) gsub 这使用由 space 组成的模式,前面没有紧跟分号,并且字符串其余部分的任何地方后面都没有分号。
gsub("(?<!;) (?!.*; )", "", test, perl = TRUE)
## [1] "ab cd ; efghij"
3) regexpr/substring 这找到分号的位置,然后使用 substring
将其分成两部分并替换 space s 与 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"
给定字符串 ab cd ; ef gh ij
,如何删除 ;
之后第一个 space 之后的所有 space,即 ab cd ; efghij
?我尝试使用 \K
但无法完全正常工作。
test = 'ab cd ; ef gh ij'
gsub('(?<=; )[^ ]+\K +','',test,perl=T)
# "ab cd ; efgh ij"
我确信有一个正则表达式解决方案(我希望有人发布),但这里有一个非正则表达式解决方案,它依赖于分号的一致性。如果有多个分隔符,您可以对其进行调整。希望它有所帮助!
> # 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"
1) gsubfn 在 gsubfn 包中使用 gsubfn
,这是一个仅使用简单正则表达式的单行代码。它将捕获组输入指定的函数(以公式表示法表示)并用函数的输出替换匹配项。
library(gsubfn)
gsubfn("; (.*)", ~ paste(";", gsub(" ", "", x)), test)
## [1] "ab cd ; efghij"
2) gsub 这使用由 space 组成的模式,前面没有紧跟分号,并且字符串其余部分的任何地方后面都没有分号。
gsub("(?<!;) (?!.*; )", "", test, perl = TRUE)
## [1] "ab cd ; efghij"
3) regexpr/substring 这找到分号的位置,然后使用 substring
将其分成两部分并替换 space s 与 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"