#r #regex
#r #регулярное выражение
Вопрос:
Я хотел бы создать шаблон для следующей текстовой строки, используя rebus
пакет в R.
Мои попытки приведены ниже, но я не могу удалить квадратные скобки и вернуть тот же шаблон, используя str_view()
. Возможно, существует инструмент / функция, которая может реплицировать выражения регулярных выражений с использованием пакета rebus? Rebus намного проще для чтения и имеет смысл при совместном использовании кода с кем-то, кто может быть не знаком с регулярным выражением.
Шаблон с регулярным выражением:
pattern = "http.*for-sale.*5857"
Я пытаюсь воспроизвести это с помощью пакета rebus:
pattern_rebus = "http" %R% zero_or_more(ANY_CHAR) %R% "for-sale" %R% zero_or_more(ANY_CHAR) %R% "5857"
as.regex(pattern_rebus)
<regex> http[.]*for-sale[.]*5857
Ответ №1:
Существует ошибка в rebus
том, что он обертывает все повторяющиеся символы ( one_or_more
или zero_or_more
) с [
помощью и ]
, класса символов. Именно поэтому .*
его следует добавлять вручную.
pattern_rebus = "http" %R% ".*" %R% "for-sale" %R% ".*5857"
as.regex(pattern_rebus)
## => <regex> http.*for-sale.*5857
Однако вы можете использовать обходной путь, [sS]
вместо .
того, чтобы сопоставлять любые символы, если вы используете регулярное выражение PCRE (с базовыми функциями регулярных выражений R) или регулярное выражение ICU (с функциями регулярных выражений stringr):
pattern_rebus = "http" %R% zero_or_more(char_class(WRD, NOT_WRD)) %R% "for-sale" %R% zero_or_more(char_class(WRD, NOT_WRD)) %R% "5857"
as.regex(pattern_rebus)
## => <regex> http[wW]*for-sale[wW]*5857
Или, если вы хотите сопоставить любой символ, кроме CR и LF:
pattern_rebus = "http" %R% zero_or_more(negated_char_class("\r\n")) %R% "for-sale" %R% zero_or_more(negated_char_class("\r\n")) %R% "5857"
as.regex(pattern_rebus)
## => <regex> http[^rn]*for-sale[^rn]*5857