Как я могу удалить или выделить определенный контекст в тексте?

#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. Это обратная ссылка для возврата группы захвата, упомянутой в (.*) . Я думаю, что в ваших реальных данных есть еще один экземпляр, который имеет 2 n . Попробуйте sub('.*n{5}\s*(.*?)\s*n{2}.*', '\1', data) сделать группу захвата не жадной с .*? помощью .

3. теперь работает идеально! все еще любопытно, что не так с моими str_split и str_subset. Но ваш метод гораздо более скуп. Спасибо!

4. Я не думаю str_subset , что это правильная функция здесь. Посмотрите несколько примеров того, как он используется в ?str_subset . Он возвращает всю строку, если шаблон соответствует. Здесь вы хотите вернуть только часть строки, а не всю строку целиком.

5. Вы читали tidytextmining.com ? Похоже, это хороший ресурс.