我想知道如何在R中实现条件正则表达式。这似乎可以在PERL中实现:
?(if)then|else
但是,我很难弄清楚如何在R中实现这个。举个简单的例子,让我说我有以下字符串:
c('abcabd', 'abcabe')
我希望正则表达式匹配"bd"
(如果存在)和"bc"
,否则将其替换为"zz"
。因此,我希望上面的字符串是:
c('abcazz', 'azzabe')
我尝试使用sub
和str_replace
这两者似乎都不起作用。我的语法似乎在sub
:
sub('b(?(?=d)d|c)', 'zz', c('abcabe','abcabd'), perl=TRUE)
[1] "azzabe" "azzabd"
逻辑是"匹配b,如果后跟d匹配d,否则匹配c"。使用str_replace
,我收到错误:
str_replace(c('abcabe','abcabd'), regex('b(?(?=d)d|c)'), 'zz')
Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), :
Use of regexp feature that is not yet implemented. (U_REGEX_UNIMPLEMENTED)
我主要使用stringr
因此更喜欢使用str_replace
的解决方案,但使用sub
对解决方案开放。
答案 0 :(得分:1)
你差不多了但是你应该在每一步中都有条件模式的真正断言:
(?(?=.*bd)bd|bc)
你甚至不需要有条件的正则表达式:
^(.*)bd|bc
R代码:
sub('^(.*)bd|bc', '\\1zz', c('abcabe','abcabd'))