我正在尝试使用R来标记在以下规则下的假设词(由a和b的序列组成)的音节边界(带有句点):
a.a
,而不是aa
a.bba
,而不是abb.a
ab.bba
,而不是a.bbba
我写了以下几行,起初似乎有用。
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似乎会跳过一个角色以寻找外观。无论如何,我该怎么办?
答案 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"