在R中使用此特定模式“ digitsXdigits”查找字符串

时间:2019-08-02 03:27:41

标签: r regex pcre regex-lookarounds

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

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

3 个答案:

答案 0 :(得分:2)

似乎x的两边都没有什么实际限制,除了至少存在一些数字。因此,我们可以使用[^ ]来匹配任何非空格的内容:

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

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

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

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

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

答案 1 :(得分:1)

也许您可以使用此模式

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

答案 2 :(得分:1)

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

模式是:一个数字,零或1出现的不是空格的事物,x,零或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