【问题标题】:Regular Expression in R: disentangling similar possibilitiesR中的正则表达式:解开类似的可能性
【发布时间】:2015-01-30 13:07:05
【问题描述】:

我有一个看起来像这样的名字列表

Noms<- c("André Coin", "XXXAndré Coin", "Gabriel Péri","Léon Blum", "XXXLéon Blum") 

我正在尝试创建一个函数,每次在很长的文本中找到这些名称中的每一个时,在以“M”或“Mme”开头的行的开头。

我的文本是一个向量,其中每一行都是一个元素。

所以最后会匹配像"M. André Coin said bla bla" 这样的行;但不会匹配像 "He said bla bla bla to M. André Coin" 这样的行。

最后的要求是“安德烈币”可以与“XXX安德烈币”区分开来。

我目前找到的解决方案是:

findpattern <- function(name,vect) {
    x<-paste0("^.{1,3}((M\\s*)|(Mme\\s*))*\\s*",name)
    found<-grepl(x,vect)
    return(found)
    }

但是,当我运行findpattern(Noms,txt) 时,它无法区分“André Coin”和“XXX And​​ré Coin”。意思是findpattern("André Coin", "M. XXXAndré Coin")=TRUE". 你能帮我找出我写正则表达式的错误吗?

【问题讨论】:

  • 我尝试输入你的函数和findpattern("André Coin", "M. XXXAndré Coin"),结果是FALSE...
  • 确实...我很确定我复制了与之前完全相同的代码。我猜一些错字以某种方式解决了这个问题

标签: r regex replace


【解决方案1】:

您在M 之后错过了一个点,并且前 3 个字符必须是可选的(即从 0 到 3 个字符):

"^.{0,3}((M\\.\\s*)|(Mme\\s*))*\\s*"

如果M 后面的点是可选的:

"^.{0,3}((M\\.?\\s*)|(Mme\\s*))*\\s*"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多