R:不会跳过任何字符的环视

时间:2015-05-07 12:39:20

标签: r perl regex-lookarounds

我正在尝试使用R来标记在以下规则下的假设词(由a和b的序列组成)的音节边界(带有句点):

  1. 在任何两个a之间插入句点。 >> a.a,而不是aa
  2. 如果两个a之间有两个或更少的b,则将周期放在左边。 >> a.bba,而不是abb.a
  3. 将句点放在任何其他b的右侧。 >> ab.bba,而不是a.bbba
  4. 我写了以下几行,起初似乎有用。

    S <- c('b{0,2}a(b(?=bb))*') # syllable structure
    
    words <- c('abababa','abbabaabbb','bbabbbba')
    
    p <- function(string){paste0(string,collapse='')} # shorthand collapse to single string
    
    gsub(p(c(S,'\\K(?=',S,')')),'.',words,perl=T)
    #[1] "a.ba.ba.ba"    "a.bba.ba.abbb" "bbabb.bba"  # all correct
    

    但是我尝试了更多的单词并发现了一个问题:

    words <- c('aaaa','baabbba')
    #[1] "a.aa.a"         "ba.abbba"  # should be a.a.a.a / ba.ab.bba
    

    显然,问题是如果“a”之前是另一个“a”,则在“a”之后插入时间段失败。我不相信我对S的定义有任何问题。相反,如果该角色已用于先前的环视,则R似乎会跳过一个角色以寻找外观。无论如何,我该怎么办?

1 个答案:

答案 0 :(得分:2)

令牌由正则表达式引擎“消耗”,因此不能使用两次。只需再次执行替换:

f <- function(words) gsub(p(c(S,'\\K(?=',S,')')),'.',words,perl=T)
f(words)
[1] "a.aa.a"   "ba.abbba"
f(f(words))
[1] "a.a.a.a"   "ba.ab.bba"