использование захваченных групп в str_replace/stri_replace - stringi vs stringr

Большинство функций stringr являются просто оболочками соответствующих функций stringi. str_replace_all является одним из них. Однако мой код не работает с stri_replace_all, соответствующей функцией stringi.

Я пишу быстрое регулярное выражение для преобразования (подмножества) верблюжьего регистра в разделенные слова.

Я очень озадачен тем, почему это работает:

str <- "thisIsCamelCase aintIt"
stringr::str_replace_all(str, 
                         pattern="(?<=[a-z])([A-Z])", 
                         replacement=" \\1")
# "this Is Camel Case ain't It"

И это не так:

stri_replace_all(str, 
                 regex="(?<=[a-z])([A-Z])", 
                 replacement=" \\1")
# "this 1s 1amel 1ase ain't 1t"

person asachet    schedule 19.08.2016    source источник
comment
Один из вариантов: stri_replace_all(str, regex = "(?<=[a-z])(?=[A-Z])", replacement=" ")   -  person akrun    schedule 19.08.2016


Ответы (2)


Если вы посмотрите на исходный код stringr::str_replace_all, вы увидите, что он вызывает fix_replacement(replacement) для преобразования ссылок группы захвата \\# в $#. Но справка по stringi:: stri_replace_all также ясно показывает, что вы используете $1, $2 и т. д. для групп захвата.

str <- "thisIsCamelCase aintIt"
stri_replace_all(str, regex="(?<=[a-z])([A-Z])", replacement=" $1")
## [1] "this Is Camel Case aint It"
person hrbrmstr    schedule 19.08.2016

Опция ниже должна возвращать один и тот же результат в обоих случаях.

pat <- "(?<=[a-z])(?=[A-Z])"
str_replace_all(str, pat, " ")
#[1] "this Is Camel Case aint It"
stri_replace_all(str, regex=pat, " ")
#[1] "this Is Camel Case aint It"

Согласно странице справки ?stri_replace_all, есть примеры, которые предлагают использовать $1, $2 для замены

stri_replace_all_regex('123|456|789', '(\\p{N}).(\\p{N})', '$2-$1')

Итак, это должно работать, если мы заменим \\1 на $1

stri_replace_all(str, regex = "(?<=[a-z])([A-Z])", " $1")
#[1] "this Is Camel Case aint It"
person akrun    schedule 19.08.2016