#r #text
Вопрос:
Вот мои данные
data<- "line1nline2nnnnn VICTIMS OF GUN VIOLENCE TO HOLD GUN TRAFFICKERS LIABLEnn line3"
Мне нужен текст между пятью последовательными «n» и двумя последовательными «n» :
«ЖЕРТВЫ НАСИЛИЯ С ПРИМЕНЕНИЕМ ОГНЕСТРЕЛЬНОГО ОРУЖИЯ ДЛЯ ПРИВЛЕЧЕНИЯ ТОРГОВЦЕВ ОРУЖИЕМ К ОТВЕТСТВЕННОСТИ»
Я пытался
text-<str_split(data,"n")
str_subset(text,".*n{5}\s*(.*)\s*n{2}.*")
Я получаю:
Предупреждающее сообщение:
В stri_subset_regex(строка, шаблон, пропуска_на = ИСТИНА, отрицание = отрицание, :
аргумент не является атомарным вектором; принудительное
Ответ №1:
Опция base R, используемая sub
для захвата текста между 5 'n'
и 2 'n'
.
sub('.*n{5}\s*(.*)\s*n{2}.*', '\1', data)
#[1] "VICTIMS OF GUN VIOLENCE TO HOLD GUN TRAFFICKERS LIABLE"
Комментарии:
1. Это работает. Но когда я применяю это к своим реальным данным, я получаю «ЖЕРТВЫ НАСИЛИЯ С ПРИМЕНЕНИЕМ ОГНЕСТРЕЛЬНОГО ОРУЖИЯ ДЛЯ ПРИВЛЕЧЕНИЯ ТОРГОВЦЕВ ОРУЖИЕМ К ОТВЕТСТВЕННОСТИnn (г-н КАСТЕН из Иллинойса …». Я использую «строку 3″ для представления текста после 2″n» в моем вопросе. Я не понимаю аргумента: используйте «\1″ для замены». *n{5}\s*(.*)\s*n{2}.*»? Большое спасибо!
2. Это обратная ссылка для возврата группы захвата, упомянутой в
(.*)
. Я думаю, что в ваших реальных данных есть еще один экземпляр, который имеет 2n
. Попробуйтеsub('.*n{5}\s*(.*?)\s*n{2}.*', '\1', data)
сделать группу захвата не жадной с.*?
помощью .3. теперь работает идеально! все еще любопытно, что не так с моими str_split и str_subset. Но ваш метод гораздо более скуп. Спасибо!
4. Я не думаю
str_subset
, что это правильная функция здесь. Посмотрите несколько примеров того, как он используется в?str_subset
. Он возвращает всю строку, если шаблон соответствует. Здесь вы хотите вернуть только часть строки, а не всю строку целиком.5. Вы читали tidytextmining.com ? Похоже, это хороший ресурс.