Регулярное выражение для соответствия первым нескольким символам, повторенным дважды в строке - PullRequest
2 голосов
/ 13 февраля 2020

У меня проблема с поиском всех строк, которые имеют первые несколько (> = 2) символов повтор дважды в строке на языке R.
Например

Строки должны выбрать
(1) все ochir все y ------> первые 3 символа «все» повторены дважды в строке
(2) froufrou ------> первые 4 символа 'frou' повторяются дважды в строке
(3) в gro под ------> первые 5 символов «под» повторяются дважды в строке

Строки должны НЕ выделять
(1 ) gummage ------> даже первый символ 'g' повторяется дважды, но только 1 символ, не соответствует условию, поскольку> = 2 первых символа
(2) hypergoddess ------> нет первых нескольких символов повторяется дважды
(3) kgashga ------> четное «ga» повторяется дважды, но не включает первый символ «k», не соответствует условию, требующему включения первого символа

Слышал о backreference (например, \ b или \ w) mig Это может быть полезно, но все еще не в состоянии понять, не могли бы вы помочь выяснить?

Примечание: я вижу, что в качестве метода для использования используется xmatch <- str_extract_all(x, regex) == x, str_extract_all из library(stringr)

x <- c("allochirally", "froufrou", "undergrounder", "gummage", "hypergoddess", "kgashga")
regex <- "as described details here"
function(x, regex) {
  xmatch <- str_extract_all(x, regex) == x
  matched_x <- x[xmatch]
}

Если очень кратко предпочли бы!! Спасибо

Ответы [ 2 ]

5 голосов
/ 13 февраля 2020

Использовать grepl:

x <- c("allochirally", "froufrou", "undergrounder", "gummage", "hypergoddess", "kgashga")
grepl("^(.{2,}).*\\1.*$", x)

[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE

Шаблон регулярного выражения соответствует и захватывает первые два или более символов, а затем также утверждает, что те же два или более символов встречаются позже в строке.

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

x[grepl("^(.{2,}).*\\1.*$", x)]

[1] "allochirally"  "froufrou"      "undergrounder"
1 голос
/ 13 февраля 2020

Как насчет:

^(\w{2,}).*?\1.*?$

Как видно здесь

Объяснение:

Первая группа захвата (\w{2,}) соответствует начальным нескольким символам, а обратная ссылка \1 относится к этой группе захвата.

При необходимости позже вы можете обратиться к той части символов, которая повторяется с использованием group (1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...