#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$
.