在 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
我正在尝试通过查找具有特定模式的字符串来清理字符串列表,但不知道如何编写正则表达式来查找它们。
我正在使用 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