【问题标题】:Find strings in R with this specific pattern "digitsXdigits"使用此特定模式“digitsXdigits”在 R 中查找字符串
【发布时间】:2023-03-17 17:45:01
【问题描述】:

我正在尝试通过查找具有特定模式的字符串来清理字符串列表,但不知道如何编写正则表达式来查找它们。

我正在使用 grepl(),但不知道如何定义模式。

模式是数字然后[必须包括x,可能是特殊字符,字母],然后是数字。

Here are some examples:           OUTPUT from grepl()
"kills kld ldks 2087x-2714"     TRUE
"sdlsn dklsk 4.75x25"           TRUE
"dkks klsdk  3x4x135"           TRUE
"djnlsdkl250shd"                FALSE
"kdls, skfndkl 24gx.75"         TRUE
"ski lsdkcm lskd 12.6"          FALSE
"klslc ksldml 3.0 dnjsl 67n030" FALSE

这是一个有点复杂的模式。基本上它必须在 x 的两边都包含数字,但也可以包含特殊字符和数字。

【问题讨论】:

  • 欢迎来到 Stack @Nate P。您能否提供您想要的预期输出以及您尝试运行的代码以帮助进一步定义您的问题?
  • 我只是在寻找每个字符串中包含的 TRUE 或 FALSE。如果我有一个有效的正则表达式,我可以使用 grepl() 来找到它。
  • 所以"kdls, skfndkl x24g.75" 会是FALSE
  • 是的,这将是错误的。

标签: r regex pcre regex-lookarounds


【解决方案1】:

除了至少存在一些数字之外,x 两侧可能发生的事情似乎没有真正的限制。所以我们可以使用[^ ] 来匹配任何不是空格的东西:

grepl("[^ ]*\\d+[^ ]*x[^ ]*\\d+[^ ]*", x, perl = TRUE)

这给出了您对示例的预期输出,但我不能保证它适用于所有情况,除非您可以缩小限制范围。

正如 ikegami 所建议的,如果您需要做的只是检测这些模式(而不是将它们从字符串中提取出来),您可以将其简化为:

grepl("\\d[^ ]*x[^ ]*\\d", x, perl = TRUE)

这可能会快很多,具体取决于您的输入,因为像 [^ ]* 这样的东西在正则表达式中可能会非常慢(搜索“正则表达式回溯”以获得概览)

【讨论】:

    【解决方案2】:

    使用 stringr 包中的 str_detect。我在 x 的末尾添加了两个额外的测试字符串。

    模式是:一个数字,0 或 1 次非空格的出现,一个 x,0 或 1 次非空格的出现,一个数字

    x <- c("kills kld ldks 2087x-2714",
           "sdlsn dklsk 4.75x25",
           "dkks klsdk  3x4x135",
           "djnlsdkl250shd",
           "kdls, skfndkl 24gx.75",
           "ski lsdkcm lskd 12.6",
           "klslc ksldml 3.0 dnjsl 67n030",
           "5x25",
           "kdls skfndkl x24g.75")
    
    str_detect(x, "\\d\\S?x\\S?\\d")
    
    #[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE
    

    【讨论】:

      【解决方案3】:

      也许你可以使用这种模式

      grepl("\\d.*x.*\\d",x)
      #[1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE
      

      数据

      x <- c("kills kld ldks 2087x-2714","sdlsn dklsk 4.75x25",
             "dkks klsdk  3x4x135","djnlsdkl250shd",
             "kdls, skfndkl 24gx.75","ski lsdkcm lskd 12.6",
             "klslc ksldml 3.0 dnjsl 67n030")
      

      【讨论】:

      • 我怀疑 Marius 是正确的,数字和x 之间不能有空格。也许也可以为此提供解决方案。
      • 你的意思是grepl("\\d[^ ]x[^ ]\\d",x) 吗?
      • 是的,完全正确。我不熟悉R,但我怀疑\S(转义为\\S)可以用来代替[^ ]
      • 谢谢这个解决方案很棒!
      猜你喜欢
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多