R中正则表达式的异常处理

时间:2014-07-18 02:32:22

标签: regex r

我发现了几个相关的问题,但还没找到我解决问题的问题,如果我错过了一个解决这个问题的问题,请告诉我。

基本上我想使用正则表达式来查找模式,但基于前面的字符有异常。例如,我有以下文本对象("松饼")作为向量,我想匹配名称(" Sarah"," Muffins"和& #34;鲍勃&#34):

muffins
  

[1]"亲爱的莎拉,"
  [2]"我爱你的狗,松饼,可爱而且非常友好。但是,我不能说我喜欢“松饼”#34;他经常离开我的前院。请考虑把他放在外面的皮带上并像邻居中的其他人一样正确地走他。"

     

[3]"此致,"
  [4]" Bob"

我的方法是搜索大写单词,然后排除因语法原因而大写的单词,例如句子的开头。

 pattern = "\\b[[:upper:]]\\w+\\b"
 m = gregexpr(pattern,muffins)
 regmatches(muffins,m)

这种模式让我大部分时间都回归:

  

[[1]]   [1]"亲爱的" "萨拉"

     

[[2]]   [1]"松饼" "然而" "请"

     

[[3]]   [1]"真诚地"

     

[[4]]   [1]"胜利"

我可以通过以下方式识别一些句子:

 pattern2 = "[.]\\s[[:upper:]]\\w+\\b"
 m = gregexpr(pattern2,muffins)
 regmatches(muffins,m)

但我似乎无法同时做到这两点,我说我想要的模式不是这样的。

我尝试了几种我认为可行的组合,但收效甚微。我试过的一些:

pattern2 = "(?<![.]\\s[[:upper:]]\\w+\\b)(\\b[[:upper:]]\\w+\\b)"
pattern2 = "(^[.]\\s[[:upper:]]\\w+\\b)(\\b[[:upper:]]\\w+\\b)"

非常感谢任何建议或见解!

3 个答案:

答案 0 :(得分:2)

你可能正在寻找一个负面的背后。

pattern = "(?<!\\.\\s)\\b[[:upper:]]\\w+\\b"
m = gregexpr(pattern,muffins, perl=TRUE)
regmatches(muffins,m)

# [[1]]
# [1] "Dear"  "Sarah"
# 
# [[2]]
# [1] "Muffins"
# 
# [[3]]
# [1] "Sincerely"
# 
# [[4]]
# [1] "Bob"

部分(?<!\\.\\s)背后的外观确保比赛前没有句号和空格。

答案 1 :(得分:1)

以下正则表达式仅匹配名称BobSarahMuffins

(?<=^)[A-Z][a-z]+(?=$)|(?<!\. )[A-Z][a-z]+(?=,[^\n])|(?<= )[A-Z][a-z]+(?=,$)

DEMO

答案 2 :(得分:1)

尝试使用正则表达式来识别名称会成为一个问题。没有希望可靠地工作。从任意数据中匹配名称非常复杂。如果提取这些名称是您的目标,您需要以不同的方式处理此问题,而不是简单地尝试匹配大写字母后跟单词字符。

考虑到你的向量与你在问题中发布的一样:

x <- c('Dear Sarah,', 
       'I love your dog, Muffins, who is adorable and very friendly. However, I cannot say I enjoy the "muffins" he regularly leaves in my front yard. Please consider putting him on a leash outside and properly walking him like everyone else in the neighborhood.', 
       'Sincerely', 
       'Bob')

m = regmatches(x, gregexpr('(?<!\\. )[A-Z][a-z]{1,7}\\b(?! [A-Z])', x, perl=T))
Filter(length, m)

# [[1]]
# [1] "Sarah"

# [[2]]
# [1] "Muffins"

# [[3]]
# [1] "Bob"