【问题标题】:Match on interval with wildcard使用通配符匹配区间
【发布时间】:2018-09-05 10:01:43
【问题描述】:

我有两个值,例如:

from = XY05*
to = XY55*

然后我有一个包含很多字符串的tbl_dff

Codes = ["XY05A", "XY56", "XY555", "AT003", "XY55AB", "XY35QA"
              "GA003A", "XY36", "XY100", "XY03",...]

我想使用我的变量fromto 来查看我的Codes 变量中是否有这些变量。

从示例中,我希望匹配:

"XY05A"
"XY555"
"XY36"
"XY55AB"
"XY35QA"

因为它在XY05* - XY55* 之间。 * 只是说,我不在乎之后是什么。

希望这是有道理的。

【问题讨论】:

  • XY36 匹配,因为 36 介于 5 和 55 之间?
  • 为什么要在 XY555 上匹配,而不是在 XY100 上匹配?
  • @missuse 是的。所以我想匹配包含 XY 的区间 05-55 之间的所有内容。
  • @Wimpel 因为我在XY55*后面有通配符,所以我也可以在XY55A上匹配。我已经更改了示例,以显示我还希望匹配 * 之后的字母和数字
  • 您可以随时测试字符串是否 >= XY05 和 XY56。

标签: r regex pattern-matching matching


【解决方案1】:

试试这个模式:XY(0[5-9]|[1-4]\d|5[0-5]).*

(0[5-9]|[1-4]\d|5[0-5]) 将匹配0555 之间的任意数字以及之后任意数量的任意字符。

Demo

【讨论】:

  • 它有效,如果我的fromto 发生变化,我需要更改什么?例如:from = weq23*to = weq24*
  • @KaZyKa weq 替换 XY(0[5-9]|[1-4]\d|5[0-5])$ 变为 2[34]$05.|55. 将变为 23.|24.。而模式会变成:weq(2[34]$|23.|24.),可以简化为weq2[34].。但这是特殊的,因为 23 和 24 之间没有数字 :)
  • @KaZyKa 如果它解决了您的问题,您应该接受答案并选择投票。
  • 图尔琴。我刚刚玩过你的正则表达式。如果我有 XY55AB,它不能解决,但对于 XY55A 可以。在 XY55* 之后,我应该能够匹配字符串,无论它有额外的字母还是五个。所以我必须说它没有解决我的问题:(
  • 图尔琴。很好:)但是如果我在间隔之间有一些东西,它也应该起作用,例如XY23 工作正常,但 XY23A... 不工作。与XY35works 相同,但XY35A... 不起作用。 ... 只是说我不知道​​* 之后有多少个字母:) 你能更新它,所以它也适用于这个吗? :)
【解决方案2】:

您可以将fromto 作为整数而不是完整的字符串吗?这样您就可以从Codes 向量中提取整数,并将它们直接与fromto 进行比较:

from <- 5
to <- 55

pattern <- "XY([0-9]+).*"

# use regex to extract the integer part of each string
Codes_int <- as.integer( sub( pattern, "\\1", Codes ) )

# return only the `Codes` where the integer is in range
Codes[ Codes_int >= from & Codes_int <= to & grepl( pattern, Codes ) ]

【讨论】:

  • 但是如果 XY 代码更改为 WEQ f.x. 怎么办?我可以在您的Codes_int &lt;- as.integer( sub( "(asvariable)([0-9]+).*", "\\1", Codes ) ) 中将其作为变量吗?
  • 然后您更改代码以匹配您的需要。请参阅我的编辑,如果这对您来说更容易,您可以轻松地将该变量移到外面。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 2017-05-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多