【问题标题】:regular expression to filter out phrase based on the last few characters in R正则表达式根据 R 中的最后几个字符过滤掉短语
【发布时间】:2011-12-27 14:59:15
【问题描述】:

我有几个短语如下:

abc_xy_def
abc_xy
abc_vw_def
abc_vw
def_ab

我想使用正则表达式将它们过滤成两组:一组具有abc_ 头部和_def 尾部,另一组仅具有abc_ 头部。

我尝试过这样的事情:

> grepl("abc_[(a-z_)*][^def]","abc_xy_def")
[1] TRUE
> grepl("abc_[(a-z_)*][^def]","abc_xy")
[1] TRUE

但它不起作用,有人可以帮忙吗?谢谢。

【问题讨论】:

标签: regex r


【解决方案1】:

全部捕获:^abc_[a-z]*(_def|)$

仅用于捕获 _def tail: ^abc_[a-z]*_def$

仅用于捕获不带_def 尾:^abc_[a-z]*$

如果不准确,请澄清您的问题。

【讨论】:

  • 应该是^abc_[a-z]+(_def|)$ 而不是^abc_[a-z]*(_def|)$"?因为_[a-z] 中的[a-z] 必须出现在我的字符串中。
  • 是的,在您的情况下,+ 会比 * 更好,因为您的字符串的这一部分是强制性的
【解决方案2】:

不知道 R,但这应该可行吗?

grepl("^abc_.+_def$","abc_xy_def")

你好像弄错了 "[^def]" 的意思,这会匹配一个不是 d , ef 所以你的正则表达式 "abc_[(a-z_)*][^def]" 将匹配任何包含 abc_ 后跟单个字符的字符串 >(az_)* > 后跟另一个不是 def

的单个字符

我在这里向你提出建议

  • ^ -> 表示我们查看字符串的开头
  • abc_ 将强制 abc_
  • .* 任意字符(不是 \n)0 到无限次
  • def 强制定义
  • $ 表示我们必须在字符串的末尾

如果你想要最后没有 _def 的人,试试这个:"abc_.+(?!def)"

【讨论】:

  • 我已经澄清了我的问题,我需要明确说明^abc 存在于字符串中
  • 然后试试 grep1("^abc_(.*)def$","abc_xy_def")
  • @malko -- 你的意思是将我对grep1 的编辑回滚到grepl 吗? (第一个不是基本 R 函数)。
  • 有效,因为我不知道 R 我假设您正在使用 grepl 函数。但我想基本上正则表达式模式基本相同,如果 grep1 是您的手工函数,最好与我们分享它的代码以了解与基本 grep 函数有什么不同
  • grepl 是一个内置的 R 函数,它作用于一个向量并返回一个与正则表达式的结果相对应的布尔向量。乔希只是想提供帮助,因为您了解正则表达式,但不了解 R。如果您按照他的建议将 grep1 更改为 grepl,您的回答会更正确。
猜你喜欢
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 2020-09-13
  • 2011-05-08
相关资源
最近更新 更多