【发布时间】:2018-02-21 21:54:59
【问题描述】:
我有一个过滤问题,我试图根据具有 4 种不同模式中的任何一种的字符串的存在来选择观察结果:
- 10 个连续数字的字符串(例如 1250126681)
- 13 个连续数字的字符串(例如 9781626724266)
- 以“id”开头后跟 9 个连续数字的字符串(例如 id975448501)
- 由大写字母和数字组合而成的字符串(长度=10)(例如 B004TLHNOC)
这是一个示例数据集:
FromName<-c("PubA","PubB","PubC","PubB","PubC","PubB")
PostName<-c("https://www.amazon.com/gp/product/1250126681/ref=as_li_tl","https://www.amazon.com/dp/B004TLHNOC/ref=sr_1_1","https://us.macmillan.com/books/9781626724266",
"https://itunes.apple.com/us/book/six-of-crows/id975448501","http://www.anrdoezrs.net/links/7992675/type/dlg/sid/MAChhjan32018eman/https://www.barnesandnoble.com/w/something-to-howl-about-christine-warren/1127202692","https://www.amazon.com/Beach-House-Cookbook-Mary-Andrews-ebook/dp/B01M2UZS7F/")
df<-cbind(FromName,PostName)
输出应如下所示:
我认为前 2 个模式的正则表达式是:^[0-9]{10}$ 和 ^[0-9]{13}$,我认为 [a-z]{2}\d{9}应该适用于选择第三种模式的观察,但我坚持模式#4。我也不确定如何将多个正则表达式模式组合成一个 dplyr 过滤函数。
【问题讨论】:
-
^(?:\d{10}(?:\d{3})?|id\d{9}|[A-Z\d]{10})$怎么样?您需要在 r 中转义反斜杠。 -
@ctwheels 谢谢。我假设 {3} 应该是 {13},代表 13 位字符串?我不明白您关于在 R 中转义反斜杠的评论。这是您刚刚给我的模式中考虑的因素,还是我需要添加其他逻辑?
-
在 R 中,正则表达式是一个字符串,但
\是一个特殊的转义字符,即使在字符串中也是如此。所以要在你的正则表达式中有\d,你需要在代表正则表达式的字符串中使用\\d。 -
@user3614783 正是 CalumYou 提到的,但
(?:\d{3})?是可选的,所以它只是将它附加到\d{10}的末尾,而不是单独指定它们为\d{10}|\d{13}。您可以使用任何一种方法。如果没有$锚点,使用\d{10}|\d{13}只会捕获前十位数字(除非您颠倒了选项的顺序)。