Как сделать необязательный просмотр назад и вперед в r - PullRequest
0 голосов
/ 08 мая 2020

Я хотел бы извлечь текст между de и en , а также текст в строках, в которых нет de или ru . Я не очень хорошо разбираюсь в регулярных выражениях, но, прочитав о просмотрах вперед и назад, мне удалось частично получить то, что я хочу. Теперь мне нужно сделать их необязательными, но что бы я ни пробовал, я не могу сделать это правильно. Любая помощь будет принята с благодарностью!

library(stringr)
(sstring = c('{\"de\":\"extract this one\",\"en\":\"some text\"}',     'extract this one',     '{\"de\":\"extract this one\",\"en\":\"some text\"}', "p (340) extract this one"))
#> [1] "{\"de\":\"extract this one\",\"en\":\"some text\"}"
#> [2] "extract this one"                                  
#> [3] "{\"de\":\"extract this one\",\"en\":\"some text\"}"
#> [4] "p (340) extract this one"

str_extract_all(string = sstring, pattern = "(?<=.de\":\").*(?=.,\"en\":)")
#> [[1]]
#> [1] "extract this one"
#> 
#> [[2]]
#> character(0)
#> 
#> [[3]]
#> [1] "extract this one"
#> 
#> [[4]]
#> character(0)

желаемый результат:

#> [1] "extract this one"         "extract this one"        
#> [3] "extract this one"         "p (340) extract this one"

Создано 08.05.2020 с помощью пакета (v0 .3.0)

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Я предлагаю шаблон, который будет соответствовать любой строке, не содержащей подстроки {"de":", или подстроке после {"de":", содержащей 1+ символов, кроме ":

(?<=\{"de":")[^"]+|^(?!.*\{"de":").+

См. regex demo .

Подробности

  • (?<=\{"de":") - положительный просмотр назад, который ищет позицию, которой непосредственно предшествует {"de":"
  • [^"]+ - затем извлекает 1+ символов, кроме "
  • | - или
  • ^ - в начале строки
  • (?!.*\{"de":") - убедитесь, что в строке нет {"de":", а
  • .+ - извлеките 1+ символов, кроме символов разрыва строки, как можно больше.

См. R демо онлайн :

library(stringr)
sstring = c('{\"de\":\"extract this one\",\"en\":\"some text\"}',     'extract this one',     '{\"de\":\"extract this one\",\"en\":\"some text\"}', "p (340) extract this one")
str_extract( sstring, '(?<=\\{"de":")[^"]+|^(?!.*\\{"de":").+')
# => [1] "extract this one"         "extract this one"        
#    [3] "extract this one"         "p (340) extract this one"
1 голос
/ 08 мая 2020

в Base R

gsub('.*de\":\"(.*)\",\"en.*',"\\1",sstring)


[1] "extract this one"        
[2] "extract this one"        
[3] "extract this one"        
[4] "p (340) extract this one"

Где:

  • .* указывает любую длину любого символа
  • (...) скобки сохраняют то, что находится внутри последнего "\\1" По сути, мы заменяли всю строку соответствующими шаблонами только тем текстом, который нам нужен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...