Как извлечь серии слов, разделенных запятыми, а также начальные и конечные слова? - PullRequest
0 голосов
/ 12 июня 2019

Учитывая этот вид текста,

this_txt <- "Blah blah blah particular phrase this guy, this other guy, that guy, that other guy, or something else blah blah blah, blah blah. Blah blah blah, blah; and so blah."

Мне нужно извлечь "этот парень, этот другой парень, тот парень, тот другой парень, что-то еще"

Итак, мне нужно указать регулярному выражению, чтобы оно совпадало с любой последовательностью слов, встречающейся между одним из следующих:

две запятые

"конкретная фраза" и запятая

запятая и "или"

"или" и пробел

Я был бы доволен решением, которое включает в себя несколько нежелательных слов, если это самое большее, что можно задать для регулярных выражений.

Я полагаю, что код будет выглядеть примерно так (который не запускается, потому что я полный нью-рег):

this_txt <- "Blah blah blah particular phrase this guy, this other guy, that guy, that other guy, or something else blah blah blah, blah blah. Blah blah blah, blah; and so blah."
this_pattern <- "^.*\\b(particular phrase|,|or)\\W(\\w+\\W+)+\\W(,|or).*$"
gsub(this_pattern, "\\2", this_txt, ignore.case = T)

EDIT:

Я все ближе с этим (который работает):

  this_txt <- "Blah blah blah particular phrase this guy, this other guy, that guy, that other guy, or something else blah blah blah, blah blah. Blah blah blah, blah; and so blah."
  this_pattern <- "^.*\\b(particular phrase)\\W+(.*)\\W+(,|or).*$"
  gsub(this_pattern, "\\2", this_txt, ignore.case = T)
#[1] "this guy, this other guy, that guy, that other guy,"

Но как включить последний пункт "что-то еще"?

1 Ответ

0 голосов
/ 17 июня 2019

Это самое близкое, что вы можете получить с текущими требованиями:

(?:\bparticular phrase\b|\bor\b|,)\s*\b(?!or\b)(\w+(?:[^,.\w]+\w+)*?)(?=\s*(?:,|\bor\b))

См. Демоверсию regex

Детали

  • (?:\bparticular phrase\b|\bor\b|,) - целое слово or или particular phrase, или запятая
  • \s* - 0+ пробелов
  • \b - граница слова
  • (?!or\b) - следующее слово не может быть or
  • (\w+(?:[^,.\w]+\w+)*?) - Группа 1:
    • \w+ - 1+ слово символов
    • (?:[^,.\w]+\w+)*? - 0+ повторений, как можно меньше
      • [^,.\w]+ - 1+ символов кроме запятой, точки или слова
      • \w+ - 1+ слово символов
  • (?=\s*(?:,|\bor\b)) - положительный прогноз, требующий 0+ пробелов и запятую после них или слово or сразу после текущей позиции.

R демо :

pattern <- "(?:\\bparticular phrase\\b|\\bor\\b|,)\\s*\\b(?!or\\b)\\K\\w+(?:[^,.\\w]+\\w+)*(?=\\s*,|\\bor\\b)"
this_txt <- "Blah blah blah particular phrase this guy, this other guy, that guy, that other guy, or something else blah blah blah, blah blah. Blah blah blah, blah; and so blah."
regmatches(this_txt, gregexpr(pattern, this_txt, perl=TRUE, ignore.case=TRUE))[[1]]

Выход:

[1] "this guy"                      "this other guy"               
[3] "that guy"                      "that other guy"               
[5] "something else blah blah blah"
...