我正在尝试通过查找具有特定模式的字符串来清理字符串列表,但不知道如何编写正则表达式来查找它们。
我正在使用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的两边都包含数字,但也可以在混合中包含特殊字符和数字。
答案 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