I'm looking at this tutorial for using RegEx with stringr
。使用以下示例:
str <- c("i.e., George W. Bush", "Lyndon B. Johnson, etc.")
gsub("([A-Z])[.]?", "\\1", str)
教程告诉我输出将生成:
[1] "George W Bush" "Lyndon B Johnson"
然后我在R上运行一个相同的脚本,这就是:
str <- c("i.e., George W. Bush", "Lyndon B. Johnson, etc.")
gsub("([A-Z])[.]?", "\\1", str)
[1] "i.e., George W Bush" "Lyndon B Johnson, etc."
它只返回原始文本。即使我在其中一个Regex测试站点运行它,它仍然会回吐同样的东西。
我做错了什么(可能)?或者教程错了(可疑)?我觉得我在这里服用疯狂的药片(已确认)。
答案 0 :(得分:1)
看起来你正在做的是对的,实际上教程中有一个错误。我也测试了正则表达式,你可以看到it here。您给出的正则表达式是捕获任何大写字母,该大写字母可能跟随或不跟随点。例如,“W”在“乔治W.布什”中用“W”代替,但“即”未被捕获和替换,因为没有任何字符大写。如果我们有“I.E.”它将被“IE”取代。为了捕获给定的名称,我们需要一个不同的正则表达式。一种方法可能是捕获名字,中间名字和姓氏。现在,您可以使用正则表达式.*([A-Z][a-z]+)\s([A-Z])[.]+\s([A-Z][a-z]+).*
查看here或使用
str <- c("i.e., George W. Bush", "Lyndon B. Johnson, etc.")
gsub(".*([A-Z][a-z]+) ([A-Z])[.]+ ([A-Z][a-z]+).*", "\\1 \\2 \\3", str)
#> [1] "George W Bush" "Lyndon B Johnson"
但是,对某些名字进行消毒可能不是最有效的。