/ / regex z dodatnim wyprzedzeniem R - r, regex, uprzedzający

dodatnie wyrażenie regularne regex R - r, regex, uprzedz

Próbuję ponownie wczytać wyrażenie regularne w R za pomocą następującego polecenia:

 sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St")

Moim celem jest zastąpienie Street with St tam, gdzie jestpo którym następuje spacja i kierunkowa NE (jak w "Północno-Wschodnim"). Wygląda na to, że uprzedzenie nie może być prostsze, ale ciągle uderzam w błąd:

Error in sub(x = streets, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",:
invalid regular expression "s((?i)Street|(?i)St.?)(?=sNE)", reason
"Invalid regexp"

Wersje tego bez pracy z wyprzedzeniem dobrzew R, ale gdy tylko dodaję jakąkolwiek stronę do mojego wyszukiwania / zamiany, trafię na błąd. Podobnie, inne funkcje regex R, takie jak grep, wydają się mieć ten sam problem.

Przekopiowałem / wkleiłem wyrażenie wyrażenia regularnego do takich silników jak https://regex101.com/ i wydaje się, że działa dobrze tam, więc jestem zdezorientowany.Czy brakuje mi czegoś podstawowego o regex w R?

EDYTOWAĆ:

Oto kopia bezpośrednio z mojej konsoli:

> street.addresses <- c("23 Charles Street NE","23 Charles St. NE")
> new.vec <- sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)
(?=\sNE)", replacement = " St")
Error in sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?
=\sNE)",  :
invalid regular expression "s((?i)Street|(?i)St.?)(?=sNE)", reason
"Invalid regexp"

Odpowiedzi:

1 dla odpowiedzi № 1

Musisz użyć sub w trybie Perla, jeśli chcesz użyć wyprzedzenia:

street <- "123 Hudson Street NE, New York, NY"
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",
replacement = " St", perl=TRUE)

[1] "123 Hudson St NE, New York, NY"

Próbny

Przy okazji, jeśli umieścisz parametry sub w ich domyślnych pozycjach, możesz pominąć imiona, zostawiając nas bardziej zwięzłym:

sub("\s((?i)Street|(?i)St\.?)(?=\sNE)", " St", street, perl=TRUE)

1 dla odpowiedzi nr 2

W rzeczywistości nie potrzebujesz dodatniej uprzedzającej, jeśli cios jest tym, czego chcesz:

street = c("2389 E. Myronga Street NE")
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)\sNE", replacement = " St")

Wydajność:

sub (x = ulica, wzór = "s ((??) Ulica | (? i) St.?) sNE", zamiennik = "St")
1 "2389 E. Myronga St NE"

Można jednak użyć pozytywnego wyglądu (i innej funkcjonalności regex zgodnej z Perl (PCRE)), jeśli ją ustawisz PERL=TRUE jako dodatkowy argument

sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St", perl=TRUE)

Powodem tej różnicy są dwa typy wyrażeń regularnych używanych w R, rozszerzone wyrażenia regularne (domyślne) i wyrażenia regularne podobne do Perla używane przez perl = TRUE (Rt, Zobacz też regular-expressions.info/rlanguage).