R: регулярное выражение для захвата всех экземпляров после данного символа - PullRequest
0 голосов
/ 03 марта 2019

Учитывая строку ab cd ; ef gh ij, как мне удалить все пробелы после первого пробела после ;, то есть ab cd ; efghij?Я пытался использовать \K, но не могу заставить его работать полностью.

test = 'ab cd  ; ef  gh ij'
gsub('(?<=; )[^ ]+\\K +','',test,perl=T)
# "ab cd  ; efgh ij"

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

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"
0 голосов
/ 03 марта 2019

Я уверен, что есть решение для регулярных выражений (которое, я надеюсь, кто-то опубликует), но здесь есть решение без регулярных выражений, которое полагается на непротиворечивость точек с запятой.Вы можете адаптировать его, если есть несколько разделителей.Надеюсь, это поможет!

> # 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"
...