Использование stringr для извлечения одного или нескольких слов из текстовой строки в R

У меня есть следующий фрейм данных:

df <- data.frame(city=c("in London", "in Manchester city", "in Sao Paolo"))

Я использую str_extract и возвращаю слово после «in» в отдельном столбце.

library(stringr)
str_extract(df$city, '(?<=in\\s)\\w+')

У меня это нормально работает в 95% случаев. Тем не менее, есть случаи, такие как «Сан-Паулу» выше, когда мое регулярное выражение возвращает «Сан», а не название города.

Может кто-нибудь, пожалуйста, помогите мне изменить его, чтобы захватить:

1) все до конца текстовой строки, из которой я извлекаю? ИЛИ

2) если после "in" есть более одного слова, верните и его

Большое спасибо.


person RichS    schedule 17.01.2016    source источник
comment
Вы просто хотите (?<=in\\s).+? Или (?<=in\\s)\\w+(?:\\s+\\p{Lu}\\p{L}*)?? Похоже, вам будет безопаснее с (?<=in\\s)\\p{Lu}\\p{L}*(?:\\s+\\p{Lu}\\p{L}*)*.   -  person Wiktor Stribiżew    schedule 18.01.2016
comment
почему бы просто не gsub('^in ', '', df$city)   -  person rawr    schedule 18.01.2016
comment
Что бы это ни стоило, причина, по которой ваше регулярное выражение не подбирает Паоло в Сан-Паулу, заключается в том, что пробел не считается символом слова, поэтому \\w+ останавливается, когда доходит до пробела. Вы должны быть осторожны при настройке, потому что, если вы просто разрешите пробелы, вы в конечном итоге захватите Манчестер-Сити, а не просто Манчестер.   -  person tblznbits    schedule 18.01.2016
comment
Я также рекомендую использовать str_match, так как между in и городом могут быть двойные пробелы. Например. cities = str_match(df$city, '\\bin\\s+(\\p{Lu}\\p{L}*(?:\\s+\\p{Lu}\\p{L}*)*)'), а затем cities[,2] будут хранить значения.   -  person Wiktor Stribiżew    schedule 18.01.2016
comment
@WiktorStribiżew ваше простейшее регулярное выражение '(?‹=in\\s).+' в этом случае работает лучше всего. Большое спасибо!   -  person RichS    schedule 20.01.2016
comment
Отлично, опубликовано как ответ, рассмотрите возможность принятия.   -  person Wiktor Stribiżew    schedule 20.01.2016


Ответы (4)


Чтобы сопоставить всю оставшуюся часть строки после первого in, за которым следует пробел, вы можете использовать

(?<=in\\s).+

Lookbehind сопоставляет препозицию in с пробелом после него, но не возвращает его внутри совпадения, поскольку lookbehind — это утверждения нулевой ширины.

person Wiktor Stribiżew    schedule 20.01.2016

Этот лайнер делает это за вас?

unlist(lapply(strsplit(c("in London", "in Sao Paulo", "in Manchester City"), "in "), function(x) x[2]))
[1] "London"          "Sao Paulo"       "Manchester City"
person Alex Thompson    schedule 17.01.2016

Вы можете попробовать это:

library(stringr)
df$onlyCity <- str_extract(df$city, '[^in ](.)*')
df
                city        onlyCity
1          in London          London
2 in Manchester city Manchester city
3       in Sao Paolo       Sao Paolo
person Gopala    schedule 18.01.2016

gsub("^in[ ]*(.*$)", "\\1", df$city)
[1] "London"          "Manchester city" "Sao Paolo" 

Предполагается, что ваши строки начинаются с "in", за которым следует некоторое количество пробелов (не будет сбоя при использовании более одного), за которым следует интересующий текст, который захвачен от первого непробельного символа до конца строки.

person Jonathan Carroll    schedule 19.01.2016