Регулярное выражение с группой без захвата с использованием Stringr в R

Я пытаюсь использовать группы без захвата с функцией str_extract из пакета stringr. Вот пример:

library(stringr)
txt <- "foo"
str_extract(txt,"(?:f)(o+)")

Это возвращает

"foo"

пока я ожидаю, что он вернется только

"oo"

как в этом сообщении: https://stackoverflow.com/a/14244553/3750030

Как мне использовать группы без захвата в R, чтобы удалить содержимое групп из возвращаемого значения при использовании его для сопоставления?


person user3750030    schedule 26.03.2016    source источник
comment
Попробуйте str_extract(txt,"(?<=f)(o+)")   -  person akrun    schedule 26.03.2016


Ответы (1)


Когда вы используете регулярное выражение (?:f)(o+), это не будет Захват, но он точно будет соответствовать ему.

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

как в этом сообщении: https://stackoverflow.com/a/14244553/3750030

Вы неправильно поняли этот ответ. Не захватывающие группы не означают Несоответствие. Они записаны в $1 (группа 1), потому что перед ним нет группы.

Если вы хотите Только совпадение, предположим, что B, за которым следует A, тогда вам следует использовать positive lookbehind, как это.

Регулярное выражение: (?<=f)(o+)

Пояснение:

  • (?<=f) Это будет искать f за следующим токеном, но не совпадет.

  • (o+) Это будет соответствовать и захватывается как группа (здесь, в $ 1), если выполняется предыдущее условие.

Regex101 Demo

person Community    schedule 26.03.2016
comment
К вашему сведению: группы захвата недоступны с str_extract. Вместо этого используйте str_match. В этом случае достаточно (?<=f)o+. - person Wiktor Stribiżew; 26.03.2016
comment
Понятно сейчас! Спасибо за подробное объяснение! - person user3750030; 26.03.2016