我在这个gsub示例中做错了什么?

时间:2018-03-08 03:53:06

标签: r regex stringr

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测试站点运行它,它仍然会回吐同样的东西。

From https://regex101.com/

我做错了什么(可能)?或者教程错了(可疑)?我觉得我在这里服用疯狂的药片(已确认)。

1 个答案:

答案 0 :(得分:1)

看起来你正在做的是对的,实际上教程中有一个错误。我也测试了正则表达式,你可以看到it here。您给出的正则表达式是捕获任何大写字母,该大写字母可能跟随或不跟随点。例如,“W”在“乔治W.布什”中用“W”代替,但“即”未被捕获和替换,因为没有任何字符大写。如果我们有“I.E.”它将被“IE”取代。为了捕获给定的名称,我们需要一个不同的正则表达式。一种方法可能是捕获名字,中间名字和姓氏。现在,您可以使用正则表达式.*([A-Z][a-z]+)\s([A-Z])[.]+\s([A-Z][a-z]+).*查看here或使用

在R中获得效果
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"

但是,对某些名字进行消毒可能不是最有效的。