【问题标题】:How to extract characters from a string based on the text surrounding them in R如何根据R中围绕它们的文本从字符串中提取字符
【发布时间】:2017-02-16 21:07:57
【问题描述】:

编辑以突出显示我正在使用的语言我正在使用 R 语言,并且我有许多大型字符串列表,它们具有相似的格式。我对直接在字符串中一致的一系列字符前面的字符感兴趣,但不是在字符串中的一致位置。例如:

a  <- "aabbccddeeff"
b  <- "aabbddff"
c  <- "aabbffgghhii"
d  <- "bbffgghhii"

我有兴趣提取每个字符串中"ff" 前面的两个字符。除了使用grepl() 分解每个字符串然后独立处理它们之外,我找不到任何合理的解决方案,这似乎是一种低效的方法。

【问题讨论】:

    标签: r string character extract


    【解决方案1】:

    您可以匹配这两个字符并使用 sub 和正确的正则表达式捕获它们。

    Strings = c("aabbccddeeff",
        "aabbddff",
        "aabbffgghhii",
        "bbffgghhii")
    sub(".*(\\w\\w)ff.*", "\\1", Strings)
    [1] "ee" "dd" "bb" "bb"
    

    解释,这会将整个字符串替换为“ff”之前的两个字符。如果字符串中有多个“ff”,则此表达式取last“ff”之前的两个字符。

    这是如何工作的: sub 的三个参数是:
    1. 搜索模式
    2. 替换成什么
    3. 应用它的字符串。

    大部分工作都在模式部分 - .*(\\w\\w)ff.*。模式的 ff 部分必须很明显。我们的目标是特定字符串 ff 附近的东西。在它之前出现的是(\\w\\w)。 \w 指的是“单词字符”。这意味着任何字母 a-z 或 A-Z、任何数字 0-9 或另一个字符 _。我们想要两个字符,所以我们有\\w\\w。通过将\\w\\w 括在括号中,它将这种两个字符的模式转换为一个“捕获组”,一个将保存到变量中以供以后使用的字符串。由于这是该表达式中的第一个(也是唯一一个)捕获组,这两个字符将存储在一个名为 \1 的变量中。现在我们想要这两个字符,所以为了消除前后的所有内容,我们将.* 放在前面和后面。 . 匹配任何字符,* 表示执行此操作零次或多次,因此 .* 表示任何字符的零个或多个副本。现在我们将字符串分成四个部分:“ff”、“ff”之前的两个字符、之前的所有内容和 ff 之后的所有内容。这涵盖了整个字符串。 sub 会将匹配的部分(所有内容)替换为替换模式中所说的任何内容,在本例中为“\1”。这就是你如何编写一个计算结果为\1 的字符串,这是我们存储我们想要的两个字符的变量的名称。我们这样写是因为反斜杠“转义”了后面的任何内容。我们实际上想要字符 \ 所以我们写 \ 来表示 \ 并且 \1 计算为 \1。所以字符串中的所有内容都被目标的两个字符替换。我们将此应用于字符串列表Strings 中的每个字符串。

    【讨论】:

    • 优秀。效果很好,非常感谢。然而,我很难弄清楚什么是被控制的。你能告诉我sub() 函数中的语法吗?
    • 添加到答案。如果您需要澄清,请告诉我。
    猜你喜欢
    • 2018-02-27
    • 2023-03-08
    • 2020-04-21
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多