在 R 中查找具有此特定模式的字符串 "digitsXdigits"

Find strings in R with this specific pattern "digitsXdigits"

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

我正在使用 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 的两边都包含数字,但也可以混合使用特殊字符和数字。

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

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

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

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

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

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

也许你可以使用这个模式

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")

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

模式是:一个数字,出现零次或 1 次不是 space 的东西,x,出现零次或 1 次不是 space 的东西,a数字

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