【问题标题】:Replacing repeated groups of characters using regex使用正则表达式替换重复的字符组
【发布时间】:2017-05-05 18:08:53
【问题描述】:

在 R 中,我有一个字符串,其中包含重复的字符组:

testString <- "Hi hi missing u lollol hahahahalol sillybilly haaaaa!"

我正在尝试使用 gsub 正则表达式替换每个单词中重复的字符组以产生以下输出:

"Hi hi missing u lol halol sillybilly haaaaa!"

我尝试了以下行,但没有产生正确的输出:

gsub("[[:blank:]](.+?){2,}[[blank]]\\1",
replacement="\\1", testString, perl=TRUE)

我做错了什么?

【问题讨论】:

  • 为什么是haaaaa?也许haaa?为什么预计它不会被修改?
  • 你需要一个backreference
  • 这非常接近...gsub('((([A-Za-z]+)[^\\1]+)\\2+)', '\\3', testString)
  • @WiktorStribiżew 你能帮助诊断我的方法有什么问题吗?有机会挽回吗?
  • @MichaelChirico:是的,因为您使用的是 TRE 正则表达式,"[^\\1]" 匹配除 \1 之外的任何字符。如果您使用 PCRE 正则表达式,则它匹配除 SOH 字符之外的任何字符。见this R demo。但是,这种方法在修复后不起作用 - 请参阅 this demo

标签: r regex string gsub


【解决方案1】:

您可以匹配重复的连续单词字符并跳过它们,然后使用类似的解决方案处理所有其他重复的连续字符

x <- "Hi hi missing u lollol hahahahalol sillybilly haaaaa!"
gsub("(\\w)\\1+(*SKIP)(*F)|(\\w+?)\\2+", "\\2", x, perl=TRUE)

查看regex demoonline R demo

详情

  • (\\w)\\1+(*SKIP)(*F) - 匹配并捕获一个单词 char(使用 (\\w),可以调整),然后同一字符出现 1+ 次(使用 \\1+),然后整个文本被丢弃,引擎继续搜索比赛结束后的另一场比赛(使用PCRE (*SKIP)(*FAIL) verbs序列)
  • | - 或
  • (\\w+?)\\2+ - 尽可能少的 1 个或多个单词字符被捕获到第 2 组(使用 (\\w+?)),然后匹配出现 1 次以上的相同值(使用 \\2+)。

替换只是第 2 组的值。

【讨论】:

  • 这对我来说是一个非常好的学习示例(首先,我以前从未见过 *SKIP 或 *F)。我仍在努力检查它。
  • @SimonsSchus:为什么没有预期的输出?它是Hi hi missing u lol halol sillybilly haaaaa!
  • 顺便说一句,迈克尔的解决方案,修复后,does not produce the required outout
  • @SimonsSchus:您可以将这些词添加到 SKIP-FAIL 部分:"(?:banana|(\\w)\\1+)(*SKIP)(*F)|(\\w+?)\\2+"。但在发布答案之前,我也在开始时使用{2,} 进行了测试。根据需要进行调整。
  • 提防“ratatat”和“logogogue”
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2023-04-09
  • 2023-03-16
相关资源
最近更新 更多