我想在标记之前在文本中保留单词内的连字符。该策略包括用连字符替换唯一字符,然后在标记化后用连字符替换该唯一字符。注意:我最终将使用Unicode类Pd
来捕获所有形式的连字符,但是在这里我将其保持简单,因为我认为这与问题无关。
问题:当一个单词包含多个内部连字符分隔单个字符时,该操作将失败。
示例和预期结果:
replaceDash <- function(x) gsub("(\\w)-(\\w)", "\\1§\\2", x)
# these are all OK
replaceDash("Hawaii-Five-O")
## [1] "Hawaii§Five§O"
replaceDash("jack-of-all-trades")
## [1] "jack§of§all§trades"
replaceDash("A-bomb")
## [1] "A§bomb"
replaceDash("freakin-A")
## [1] "freakin§A"
# not the desired outcome
replaceDash("jack-o-lantern") # FAILS - should be "jack§o§lantern"
## [1] "jack§o-lantern"
replaceDash("Whack-a-Mole") # FAILS - should be "Whack§a§Mole"
## [1] "Whack§a-Mole"
对于的第一个和第二个表达式,我需要什么正则表达式模式gsub()
?
您可以使用带预读功能的PCRE正则表达式来检查是否在连字符后出现字字符,但不会使用它。
replaceDash <- function(x) gsub("(\\w)-(?=\\w)", "\\1§", x, perl=T)
因此,(\\w)
将字母数字符号捕获到组1中,然后在使用\\1
反向引用的帮助下将其插入替换结果中,并且(?=\\w)
我们仅确保存在一个字字符,但正则表达式索引保持在连字符处,从而允许下一个匹配那个字字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句