我发现了几个相关的问题,但还没找到我解决问题的问题,如果我错过了一个解决这个问题的问题,请告诉我。
基本上我想使用正则表达式来查找模式,但基于前面的字符有异常。例如,我有以下文本对象("松饼")作为向量,我想匹配名称(" 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)"
非常感谢任何建议或见解!
答案 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)
以下正则表达式仅匹配名称Bob
,Sarah
和Muffins
,
(?<=^)[A-Z][a-z]+(?=$)|(?<!\. )[A-Z][a-z]+(?=,[^\n])|(?<= )[A-Z][a-z]+(?=,$)
答案 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"