当连字符包围单个内部字符时,如何替换字内连字符

时间:2016-01-28 21:13:57

标签: regex r text replace

我希望在对其进行标记之前保留文本中的单词连字符。该策略涉及将连字符替换为唯一字符,然后在标记化后用连字符替换该唯一字符。注意:我最终会使用Pd的Unicode类来捕捉所有形式的破折号字符,但在这里我保持简单,因为我不认为该部分与问题

问题:当一个单词包含多个分隔单个字符的内部连字符时,它会失败。

实例和期望的结果:

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()的第一个和第二个表达式需要哪些正则表达式模式?

2 个答案:

答案 0 :(得分:3)

您可以使用预先检查的PCRE正则表达式来检查连字符后面是否出现单词字符,但不会消耗

replaceDash <- function(x) gsub("(\\w)-(?=\\w)", "\\1§", x, perl=T)

请参阅IDEONE demo

因此,(\\w)会将一个字母数字符号捕获到第1组中,然后在\\1反向引用的帮助下将其插入到替换结果中,并使用(?=\\w)我们只确保存在单词字符,但正则表达式索引保持在连字符,从而允许该单词字符的下一个匹配。

答案 1 :(得分:-1)

您没有指定允许哪种正则表达式功能。这是一个使用零点的模式:

gsub("(?<=\\w)-(?=\\w)", "§", "jack-o-lantern");
# jack§o§trade