我在datacamp.com上有一个介绍课并遇到了问题。
目标:使用grep
查找正确的电子邮件。 “正确的电子邮件”由“@”定义,以“.edu”结尾。
电子邮件矢量:
emails <- c("john.doe@ivyleague.edu", "education@world.gov", "dalai.lama@peace.org",
"invalid.edu", "quant@bigdatacollege.edu", "cookie.monster@sesame.tv")
我在考虑
grep("@*\\.edu$",emails)
它给了我
[1] 1 4 5
因为我认为“*”匹配“多个字符”。后来我发现它不能那样工作。
原来正确的代码是
grep("@.*\\.edu$",emails)
我搜索了一些文档,只是模糊地了解如何获得正确的答案。有人可以解释一下R与正确的电子邮件完全匹配吗?非常感谢!!
答案 0 :(得分:6)
您已经被告知使用星号量词并没有为您提供所需的特异性,因此请使用&#34; +&#34;量词,强制至少一个这样的匹配。我决定通过添加一些有重复符号的地方来解决问题:
emails <- c("john.doe@@ivyleague.edu", "education@@world.gov", "dalai.lama@peace.org",
"invalid.edu", "quant@bigdatacollege.edu", "cookie.monster@sesame.tv")
grep( "^[^@]+@[^@]+\\.edu$", emails)
#[1] 5
它使用正则表达式字符类结构,其中侧面方括号内的项目被视为文字,除非有一个初始的up-caret(&#34; ^&#34;),在这种情况下它是否定的字符类,即在这种情况下除了&#34; @&#34;之外的任何字符。这也将排除at符号是第一个字符的情况。感谢KonradRudolph指出,添加"^"
作为模式中的第一个字符(表示潜在匹配的第一个字符之前的点)将阻止允许带有初始&#34; @@&#的项目34;从匹配。