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 № 1Musisz 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"
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).