R: извлечение заглавных букв и специальных символов с помощью синтаксиса strsplit и perl REGEX.

Как бы вы извлекли только / со следующими заглавными буквами и все [[:punct:]]/$[[:punct:]].

text <- c("This/ART ,/$; Is/NN something something/else A/VAFIN faulty/ADV text/ADV which/ADJD i/PWS propose/ADV as/APPR Example/NE ./$. So/NE It/PTKNEG makes/ADJD no/VAFIN sense/ADV at/KOUS all/PDAT ,/$, it/APPR Has/ADJA Errors/NN  ,/$; and/APPR it/APPR is/CARD senseless/NN again/ART ./$:")

# HOW to?
textPOS <- strsplit(text,"(   )|(?<=[[:punct:]]/\\$[[:punct:]])", perl=TRUE)
#                          ^^^ 
#                         extract only the "/" with the following capital letters
#                         and the whole "[[:punct:]]/$[[:punct:]]"

# Expected RETURN:
> textPOS
[1] "/ART" ",/$;" "/NN" "/VAFIN" "/ADV" "/ADV" "/ADJD" "/PWS" "/ADV" "/APPR" "/NE" "./$." "/NE" "/PTKNEG" "/ADJD" "/VAFIN" "/ADV" "/KOUS" "/PDAT" ",/$," "/APPR" "/ADJA" "/NN" ",/$;" "/APPR" "/APPR" "/CARD" "/NN" "/ART" "./$:"

Благодарю вас! :)


person alex    schedule 13.09.2013    source источник


Ответы (1)


Вы можете использовать gregexpr и regmatches:

regmatches(text, gregexpr('[[:punct:]]*/[[:alpha:][:punct:]]*', text))
# [[1]]
#  [1] "/ART"    "/NN"     "/VAFIN"  "/ADV"    "/ADV"    "/ADJD"   "/PWS"    "/ADV"    "/APPR"   "/NE"     "./$."    "/NE"    
# [13] "/PTKNEG" "/ADJD"   "/VAFIN"  "/ADV"    "/KOUS"   "/PDAT"   ",/$,"    "/APPR"   "/ADJA"   "/NN"     ",/$;"    "/APPR"  
# [25] "/APPR"   "/CARD"   "/NN"     "/ART"    "./$:"   

В словах регулярное выражение говорит: «Найдите вещи, которые начинаются с нуля или более знаков препинания, за которыми следует косая черта, за которой следует одна или несколько букв или знаков препинания. Если вы хотите включить числа, переключитесь на [:alnum:].


Согласно комментариям, если вам нужны только прописные буквы, регулярное выражение станет:

regmatches(text, gregexpr('[[:punct:]]*/[[:upper:][:punct:]]*', text))

Как предполагает @eddi, [A-Z] и [:upper:] примерно эквивалентны. Опять же, как предполагает @eddi, это регулярное выражение улавливает случай /LETTERS, а также случай /$punct:

/[A-Z]+|[[:punct:]]/\\$[[:punct:]]
person Justin    schedule 13.09.2013
comment
Спасибо за быстрый ответ. Хорошо :) Можно ли добавить также /$ с любым знаком препинания до и после? - person alex; 13.09.2013
comment
не знаю, хочет ли этого OP, но это также извлекает пунктуацию, например. "a,/AA" - person eddi; 13.09.2013
comment
@eddi Хороший вопрос. Мои сложные regex отбивные не справляются с задачей разбора всего этого. Когда я сталкиваюсь с подобными вещами, я часто разбираю их в несколько шагов, а не пытаюсь построить один массивный regex. - person Justin; 13.09.2013
comment
@Justin: Еще раз спасибо! Как можно избежать случая, когда строчные буквы следуют за /. Будет ли [:upper:] вместо [:alpha:] правильным (может ли он поймать $)? Предыдущий пример (измененный) не содержал всех релевантных случаев, описанных в тексте, извините. - person alex; 13.09.2013
comment
@alex просто используй [A-Z] - person eddi; 13.09.2013
comment
Я думаю, что это работает, чтобы удовлетворить точки OP '/[A-Z]+|[[:punct:]]/\\$[[:punct:]]' - person eddi; 13.09.2013
comment
@eddi Спасибо! Вы имеете в виду [[:punct:]]*/[[A-Z][:punct:]]*. Он возвращает только character(0) - person alex; 13.09.2013
comment
@eddi Спасибо! 10+! Хорошего дня :) - person alex; 13.09.2013
comment
@Justin Большое спасибо! Желаю хорошего дня :) - person alex; 13.09.2013