Попытка использовать обе скобки захвата и выбора в регулярном выражении gsub R - PullRequest
1 голос
/ 06 февраля 2020

Я хочу исключить сом текст, чтобы захватить ключ в большую строку, например:

text <- c("BLASTBLA ST-ASBA/aGABN/1234/BLA BLABLABLABLABLA", "BLA BSTLA ST ASBA/aGABN/1234/BLA BLABLASTBLABLA",
          "BLABLSTAAAaa ST  ASBA/aGABN/1234/BLA BLABLABLSTABLA")

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

c("ST-ASBA/aGABN/1234/BLA BLABLABLABLABLA", "ST ASBA/aGABN/1234/BLA BLABLABLABLA",
          "ST  ASBA/aGABN/1234/BLA BLABLABLABLA")

Я пытаюсь два вида Использование круглых скобок здесь: захват и выбор. Первый для того, чтобы исключить нежелательную часть текста, а второй для того, чтобы гибко распознать шаблон распознавания части «ST». Вот что я пытаюсь:

gsub("(.*\\s+)ST(\\-|\\s+).*", "", text)
[1] "" ""

Как мне удалить первую часть текста?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Ваш шаблон регулярного выражения соответствует всей строке, но ваша замена - пустая строка. gsub заменяет все совпадения, поэтому заменяет всю строку пустой строкой.

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

sub(".*?\\s+(ST[[:space:]-])", "\\1", text)
sub(".*?\\s+(ST[\\s-])", "\\1", text, perl=TRUE)
sub(".*?(?=\\s+(?:ST[\\s-]))", "", text, perl=TRUE)

См. онлайн-демонстрацию R

Подробности

  • .*?\\s+(ST[[:space:]-]) - соответствие регулярному выражению TRE
    • .*? - любые 0+ символов, как можно меньше
    • \s+ - 1+ пробелов
    • (ST[[:space:]-]) - Группа 1 (позже обозначается \1): ST подстрока, за которой следуют пробелы или - char
  • .*?\\s+(ST[\\s-]) - регулярное выражение PCRE, соответствующее
    • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
    • \s+ - 1 + пробелы
    • (ST[\s-]) - Группа 1 (позже обозначаемая \1): подстрока ST, за которой следует пробел или - char
  • .*?(?=\\s+(?:ST[\\s-])) - шаблон PCRE на основе прогнозирования, где (?=...) - позитивный прогноз, который сразу же проверяет соответствие своего шаблона справа от текущей позиции, но не использует текст. Он идентичен приведенному выше, но не требует обратной ссылки в шаблоне замены (поскольку сопоставленный текст не добавляется в буфер совпадений).
2 голосов
/ 06 февраля 2020

Мы могли бы использовать группу захвата и при замене указать обратную ссылку. Здесь мы сопоставляем символы (.*) и можем захватывать символы, начинающиеся с 'ST', за которыми следуют другие символы (.*). В замене укажите обратную ссылку группы (\\1)

sub(".*\\b(ST[-\\t ].*)", "\\1", text)
#[1] "ST-ASBA/aGABN/1234/BLA BLABLABLABLABLA" "ST ASBA/aGABN/1234/BLA BLABLABLABLA"  
#[3] "ST  ASBA/aGABN/1234/BLA BLABLABLABLA"  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...