R: Как использовать stringr для извлечения подстроки в качестве вывода для изменения столбца строк, который начинается со строкового шаблона и заканчивается числом?

#r #regex #dplyr #tidyverse #stringr

Вопрос:

Я создаю небольшой пример, который будет помещен в mutate(). Не знаю, почему это не работает.

 > str_extract("rs1234-<b>C</b>","^rs*\d$")
[1] NA
 

Я был бы рад, если бы вы указали на мое непонимание языка вместо того, чтобы просто предлагать решение. Я ожидаю получить «rs1234».

Комментарии:

1. Что вы ожидаете получить? str_extract("rs1234-<b>C</b>", "^rs\d ") ?

2. Я ожидаю получить «rs1234».

3. Он возвращает NA, потому что ваш \d$ не соответствует ie.. в конце строки нет цифры, которая $ обозначает конец строки

4. Но если мне просто нужна подстрока между «rs» и последним номером. Что мне делать?

5. В базе R с использованием групп захвата — sub('(^rs\d ).*', '\1', "rs1234-<b>C</b>")

Ответ №1:

Регулярное ^rs*d$ выражение соответствует

  • ^ — начало строки
  • rs* r и ноль или более случаев появления s символа
  • d — цифра
  • $ — конец веревки.

Итак, ваш шаблон соответствует строкам типа rsssss1 r3 , и т. Д.

Тебе нужно

 str_extract("rs1234-<b>C</b>", "^rs\d ")
 

где ^rsd совпадения rs в начале строки, а затем одна или несколько цифр. Смотрите эту демонстрацию регулярных выражений.

Но если мне просто нужна подстрока между «rs» и последним номером. Что мне делать?

Вы бы использовали rs.*d :

 str_extract("rs1234-<b>C</b>", "rs.*\d")
 

где rs.*d совпадения rs , затем любые нулевые или более символов, отличные от символов разрыва строки, как можно больше, а затем цифра.

ПРИМЕЧАНИЕ: Если вам также нужно сопоставить окончания строк, вам нужно добавить последний шаблон с (?s) помощью встроенного модификатора DOTALL.

Смотрите эту демонстрацию регулярных выражений.

Комментарии:

1. Спасибо! Так что, должно быть, я неправильно понял приказ об исполнении. Как я должен знать, какие операции имеют более высокий приоритет? Я думал, что то, что я сделал, даст мне строку, которая начинается с «rs» и заканчивается цифрой, потому что я использовал «^» и «$» с соответствующими аргументами. Почему это не дало мне результата? Что я сделал не так? Есть ли хороший ресурс для тщательного изучения языковых правил?

2. В чем разница между » » и «.»? Я думал, » » означает в принципе что угодно?

3. @монотонный, Тогда вы хотели ^rs.*d$ / (?s)^rs.*d$ .