2017-10-26 108 views
5

Próbuję wyodrębnić podciągi według wzorca przy użyciu funkcji gsub() R.Jak wyodrębnić podciąg przez odwrotny wzór za pomocą R?

# Example: extracting "7 years" substring. string <- "Psychologist - 7 years on the website, online" gsub(pattern="[0-9]+\\s+\\w+", replacement="", string)

[1] "Psychologist - on the website, online"

Jak widać, jest to łatwe do exlude potrzebną podciąg przy użyciu gsub(), ale muszę odwrócić wynik i coraz "7 Years" tylko. myślę o używaniu "^", coś takiego:

gsub(pattern="[^[0-9]+\\s+\\w+]", replacement="", string)

Proszę, może ktoś mi pomóc w prawidłowym regexp wzór?

+0

Chłopaki, czy możesz mi wyjaśnić, dlaczego używasz "\\ 1" w "replice =" \\ 1 ""? – Michael

Odpowiedz

5

Można użyć

sub(pattern=".*?([0-9]+\\s+\\w+).*", replacement="\\1", string) 

Zobacz this R demo.

Szczegóły

  • .*? - wszelkie 0+ znaków, jak mało, jak to możliwe
  • ([0-9]+\\s+\\w+) - grupa 1 Przechwytywanie: - jedna lub więcej cyfr
  • \\s+ - 1
    • [0-9]+ lub więcej białych znaków
    • \\w+ - 1 lub więcej wyrazów znaków
  • .* - reszta ciąg znaków (dowolny 0+, jak najwięcej)

\1 w wymianie zastępuje się treścią grupy 1.

+0

To działa. Co to znaczy "\\ 1" w argumencie "zamiennik"? Przepraszamy za pierwszy komentarz :) – Michael

+1

@Michael * '' \ 1' w zastępstwie zastępuje zawartość Grupy 1 *. '\ 1' to [zamiana wsteczna] (https://www.regular-expressions.info/replacebackref.html). –

3

można użyć przeciwieństwo \d, który jest \D w R:

string <- "Psychologist - 7 years on the website, online" 
sub(pattern = "\\D*(\\d+\\s+\\w+).*", replacement = "\\1", string) 
# [1] "7 years" 

\D* oznacza: brak cyfr tak długo, jak to możliwe, reszta jest przechwytywana w grupie, a następnie zastępuje cały ciąg znaków.

Zobacz a demo on regex101.com.

+0

Dzięki. Dobre rozwiązanie. – Michael