【问题标题】:Regular Expressions in RR中的正则表达式
【发布时间】:2015-06-16 17:22:28
【问题描述】:

我发现了一些类似的问题 R - Select string text between two values, regex for n characters or at least m characters, 但我还是有问题

说我在 r 中有一个字符串

testing_String <- "AK ADAK NAS PADK ADK 70454 51 53N 176 39W 4 X T 7"

而且我需要能够在包含 2 个字符 (AK) 和 PADK、ADK 的字符串中的第一个元素之间提取任何内容。 PADK 和 ADK 的字符会发生变化,但长度始终分别为 4 个和 3 个字符。

所以我需要拉

ADAK NAS

我想出了这个,但它可以收集从 AK 到 ADK 的所有内容

^[A-Za-z0_9_]{2}(.*?) +[A-Za-z0_9_]{4}|[A-Za-z0_9_]{3,}

【问题讨论】:

  • 有错字吗?问题是“取出 2 个字符的第一个元素和字符串 'PADK ADK' 之间的所有内容”吗?
  • 感谢您指出这一点@mlambichs

标签: regex r


【解决方案1】:

如果我正确理解了您的问题,这应该可以解决问题:

\b[A-Z]{2}\s+(.+?)\s+[A-Z]{4}\s+[A-Z]{3}\b

Demo

您必须切换 perl = TRUE 选项(以使用像样的正则表达式引擎)。

\b 表示单词边界。因此,此模式查找以 2 个字母的单词开头并以 4 个字母的单词结尾,然后是 3 个字母的单词的匹配。您的值将位于第一组。

或者,您可以编写以下代码来避免使用捕获组:

\b[A-Z]{2}\s+\K.+?(?=\s+[A-Z]{4}\s+[A-Z]{3}\b)

但我更喜欢第一种方法,因为它更容易阅读。

【讨论】:

  • 您的代码在 R 中不起作用,也许有些东西必须以某种方式转义。
  • @SabDeM 我提供了原始正则表达式模式,您确实必须用第二个反斜杠来转义反斜杠:"\\b[A-Z]{2}\\s+(.+?)\\s+[A-Z]{4}\\s+[A-Z]{3}\\b"(我猜,我不熟悉 R)
【解决方案2】:

perl=TRUE 支持 Lookbehind,所以这个正则表达式会做你想做的事:

(?<=\w{2}\s).*?(?=\s+[^\s]{4}\s[^\s]{2})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多