【问题标题】:regex to replace number between alphabets in R正则表达式替换R中字母之间的数字
【发布时间】:2017-09-01 14:05:20
【问题描述】:

我正在寻找 R 中的正则表达式来替换 2 个字母字符之间的数字。例如,将3 替换为m,如下所示:

  • Sa3ple 变为 Sample

  • Sample1.3 保持Sample1.3

    • 这个词的状态相同,因为 3 不在字母字符之间

我尝试使用以下 R 代码将 3 替换为 m,但它只是部分工作。

一个问题是,如果正则表达式匹配,而不是替换匹配的行,每次它都替换来自col3 的第一行。不确定,到底缺少什么。

df$col3[grep('[a-zA-Z][3][a-zA-Z]|[3][a-zA-Z]',df$col3)] <- gsub('[3]+', 'm', df$col3)

【问题讨论】:

  • 请做最少的研究——这里没有很好地接受纯代码编写请求。见Reference - What does this regex mean
  • 我可以给你写代码,但这会告诉你,我们只会给你答案,而不需要你证明已经尝试过任何东西。相反,我将向您提供完成此任务所需的所有信息。 ( 启动一个捕获组,而 ) 关闭它(语法是 (...),其中省略号显然被替换为您想要捕获的 something)。 \w 匹配任何 word 字符,\d 匹配任何 digit+ 是一个量词,指定匹配应包括 1 到无限制的前一个字符选择。
  • 继续我之前的评论,在正则表达式替换 $ 后跟一个数字指向捕获组。因此,如果您有一个捕获组(...)$1 将指向捕获的内容。如果您尝试编写一些正则表达式并更新您的问题,那么您更有可能得到正确的回答,因为这表明您尝试了一些事情。毕竟,我们为什么要尝试帮助连自己都不会尝试的人呢?出示试错证明,您就会得到答案。

标签: r regex


【解决方案1】:

正则表达式很难

pos <- "Sa3ple"
neg <- "Sample1.3"

gsub("([a-zA-z])\\d([a-zA-z])", "\\1m\\2", pos)
"Sample"

gsub("([a-zA-z])\\d([a-zA-z])", "\\1m\\2", neg)
"Sample1.3"

解释

(...) is group, which is referenced with \\1, \\2, etc
[a-zA-Z] is lower and uppercase letter (only 1)
\\d is any digit (add + or {2}) to identify more than 1 digit

我用这个site来学习

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多