【问题标题】:grepl() in R using complex pattern with multiple AND, ORR中的grepl()使用具有多个AND,OR的复杂模式
【发布时间】:2021-09-06 10:29:43
【问题描述】:

是否可以在grepl() 中使用这样的pattern(见下文)?

(贫穷或贫穷)AND(根除或结束或减少或减轻)和极端

目标是确定一个句子是否符合模式使用 ifelse(grepl(pattern, x, ignore.case = TRUE),"Yes","No")

例如,如果x = "结束该国的极端贫困",则返回"是",而如果x = "结束该国的贫困",则返回"否"。

较早的帖子here 仅适用于poor AND eradicat ANDextreme 等单一作品,但不适用于我的情况。有什么方法可以实现我的目标?

试过了,pattern = "(?=.*poverty|poor)(?=.*eradicat|end|reduce|alleviate)(?=.*extreme)",但它不起作用。错误是'无效的正则表达式'

【问题讨论】:

  • 你的目标是什么?为了清楚起见,请解释您的问题

标签: r regex grepl


【解决方案1】:

对于使用所有 3 个断言,您可以使用非捕获组对单词进行分组。

^(?=.*(?:poverty|poor))(?=.*extreme)(?=.*(?:eradicat|end|reduc|alleviat)).+
  • ^ 字符串开始
  • (?=.*(?:poverty|poor)) 断言贫穷或贫穷
  • (?=.*extreme)断言极端
  • (?=.*(?:eradicat|end|reduc|alleviat)) 断言根除或结束或减少或减轻
  • .+例如匹配整行

Regex demo

对于 grepl,您必须使用 perl=T 为环视启用 PCRE。

grepl('^(?=.*(?:poverty|poor))(?=.*extreme)(?=.*(?:eradicat|end|reduc|alleviat)).+', v, perl=T)

【讨论】:

  • 这很完美!太感谢了!你介意解释一下^.+ 吗?它们是必须包含的还是可选的?似乎^ 这里并不意味着一个句子应该以“贫穷”或“贫穷”开头,但在其他情况下确实意味着这个。对于.+,我不确定它的具体功能。
  • @Yingjie ^ 是断言字符串开头的锚。那是您唯一要运行所有断言的时间,并且它们自己的断言是非消耗性的,仅是断言。 .+ 是一个非常广泛的模式,可以实际匹配除换行符以外的任何字符。如果您只想允许某些字符,则可以使匹配更加具体。如果您不想匹配像extremes 这样的部分单词,您还可以使用\b 添加单词边界,例如^(?=.*\b(?:poverty|poor)\b)(?=.*\bextreme\b)(?=.*\b(?:eradicat|end|reduc|alleviat)\b).+
  • 感谢您之前的回答!我有一个后续问题——如果我想添加另一个OR 断言,我应该怎么做?在前面的例子的基础上,我还想看看一个句子是否可以匹配字符串“sustainable”。我将代码更改为:pat <- "^(?=.*(?:poverty|poor))(?=.*extreme)(?=.*(?:eradicat|end|reduc|alleviat)).+|sustainable" 并使用此示例 text <- "end extreme poor and achieve sustainable",但 stringr::str_count(string = text, regex(pattern = pat, ignore_case = T)) 仅返回 1 个匹配项(应该是 2 个匹配项)。我期待您的建议。谢谢!
  • 您介意再看一下我的问题吗?非常感谢!
  • @Yingjie 喜欢这个? regex101.com/r/lQPncg/1
猜你喜欢
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多