【问题标题】:Change all occurrences after particular letter更改特定字母后的所有匹配项
【发布时间】:2015-03-28 02:09:12
【问题描述】:

在字符串中,如何将 'o' 右侧的任何 'e' 更改为 'a'?

我第一次尝试这个,但只做了一个改变:

x <- c('keonele','keontele');
gsub('o.*\\Ke','a',x,perl=T);
[1] "keonela"  "keontela"

然后我通过相同的命令运行了两次输入并得到了正确的结果:

x <- c('keonele','keontele');
x <- gsub('o.*\\Ke','a',x,perl=T);
x <- gsub('o.*\\Ke','a',x,perl=T);
[1] "keonala"  "keontala"

如何使用一个命令彻底进行此类更改?

【问题讨论】:

  • 我认为您没有使用“preceded”的正确含义。对于您的自然语言描述,答案应该是“kaonele”、“kaonela”

标签: regex r perl replace


【解决方案1】:

你需要使用负前瞻

> x <- c('keonele','keontele')
> gsub("e(?!o)", "a", x, perl=TRUE)
[1] "keonala"  "keontala"

它将所有e 替换为a,而不是紧跟字母o

> gsub("^.*o(*SKIP)(*F)|e", "a", x, perl=TRUE)
[1] "keonala"  "keontala"

^.*?o 匹配从开头到最后一个 o 的所有字符。 (*SKIP)(*F) 使匹配失败,现在 OR 运算符旁边的模式将尝试匹配剩余字符串中的字符。所以模式e 将匹配所有e 之后的o。将 e 替换为 a 将为您提供所需的输出。

【讨论】:

  • 如果目标是'kexonele',那么你的第一个失败,你的第二个成功。 (通常情况下,这个问题太模糊,无法决定哪个是正确的,但我很乐意投票。
  • 是的,这就是我添加第二个选项的原因。起初,这个问题对我来说不清楚。感谢您的评论..
  • 我听取了您对 (SKIP)(*F) 的建议,并对其进行了一些调整并使其发挥作用。非常感谢!
猜你喜欢
  • 2023-02-20
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多