【问题标题】:Regular expression to grab word before a certain character R Perl正则表达式在某个字符R Perl之前抓取单词
【发布时间】:2013-02-19 00:39:42
【问题描述】:

我需要在 R 中的字符串中获取唯一字符(在我的例子中:&)之前和之后的单词。

我需要从以下内容中获取“word1”: “...某事 word1 & word2 某事...”

在 R 中使用 Perl 正则表达式后我可以得到这个词:(?<=& )[^ ]*(?= ) (它似乎表现得像我想要的那样。我通过梳理我在这个网站上找到的答案得到它)

我现在需要获取& 符号之前的单词。单词的长度发生变化,其他前面单词的数量以及空格也会发生变化。一个单词可以是字母和数字,只是两边有空格。

【问题讨论】:

    标签: regex perl r


    【解决方案1】:

    如果您使用(\S+)\s*&\s*(\S+),则& 两边的单词将被捕获。这允许在 & 号周围使用可选的空格。

    您需要将 R 字符串中的反斜杠加倍,并使用 regexecregmatches 函数应用模式并提取匹配的子字符串。

    string  <- "...something something word1 & word2 something..."
    pattern <- "(\\S+)\\s*&\\s*(\\S+)"
    match   <- regexec(pattern, string)
    words   <- regmatches(string, match)
    

    现在words 是一个包含三项向量的单元素列表:整个匹配字符串后跟第一个和第二个反向引用。所以words[[1]][2]word1words[[1]][3]word2

    【讨论】:

    • 如果将来有人尝试类似的东西,最初这是可行的,但最终我遇到了由于某种原因导致多个单词的情况。 & 号周围的空白是唯一一致的条件之一,所以我最终使用: (?
    • @GregS:我能想到的唯一原因是,如果您正在处理使用不间断空格"\x{A0}" 的文本。您可以改用([^\s\xA0]+)\s*&amp;\s*([^\s\xA0]+) 来解决这个问题。请注意,这是 Perl 语法。我对 R 知之甚少,这可能是也可能不是使用其代码点添加字符的正确方法。
    • 第一个小写字母 s 需要双反斜杠,否则 R 会抛出错误。否则这正是我需要的一个项目的答案!
    【解决方案2】:
    (?<=&)(\w*)(?=&)"
    

    将匹配&amp; 符号之间的任何单词字符。使用正向的后视和正向的前瞻。

    【讨论】:

      【解决方案3】:
      \b(.*?)\b&
      

      单词将被捕获在第 1 组中。这是包含在由两个边界包围的任何字符串中的不情愿匹配;第二个边界之后是&amp;

      【讨论】:

        【解决方案4】:

        这可以通过在gsubfn package 中使用strapplyc 的相对简单的正则表达式来完成。假设 s 是你的字符串:

        library(gsubfn)
        strapplyc(s, "(\\w+) & (\\w+)")
        

        【讨论】:

        • 它;在 7 年前发帖时确实有效。我已将其替换为指向其 CRAN 页面的链接。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 1970-01-01
        • 2017-03-29
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多