gsub()函数中的简单正则表达式无法正常工作

时间:2016-11-17 14:17:50

标签: r regex gsub

我刚开始使用R编程。目前,我正在着名的Titanic数据集上练习特征工程。

除其他外,我想在我的数据集中提取人物的标题。

我有这些:

Montvila, Rev. Juozas 
Johnston, Miss. Catherine Helen

想要得到这些:

Rev.
Miss.

我自己的方法不起作用。我无法弄清楚究竟是什么问题:

gsub("([A-Za-z:space:]+, )|(\.[A-Za-z:space:]+)", "", data_raw$Name)

希望有人可以帮助我!真是太棒了。

亲切的问候, 马库斯

2 个答案:

答案 0 :(得分:1)

我们可以匹配字符串的开头(\\S+)后面的一个或多个非空白字符(^),后跟一个或多个空格(\\s+)或({{ 1}})使用环顾四周匹配|后跟字符,直到字符串结尾,并将其替换为空白(.

""

或者另一种选择是将字符捕获为一个组(gsub("^\\S+\\s+|(?<=\\.).*$", "", str1, perl = TRUE) #[1] "Rev." "Miss." ),并在替换中使用该捕获组的反向引用(([^.]+\\.))。

\\1

数据

sub("^[^,]+,\\s+([^.]+\\.).*", "\\1", str1)
#[1] "Rev."  "Miss."

答案 1 :(得分:1)

我建议使用一个正则表达式替换所有文本,但最后一个字母后面加一个点。

> x <- c("Montvila, Rev. Juozas", "Johnston, Miss. Catherine Helen")
> sub("^.*\\b([[:alpha:]]+\\.).*", "\\1", x)
[1] "Rev."  "Miss."

或更简单的regmatches解决方案:

> unlist(regmatches(x, regexpr("[[:alpha:]]+\\.", x)))
[1] "Rev."  "Miss."

或者,如果你需要检查一个点,但是&#34;排除&#34;从匹配开始,使用带有regmatchesperl=TRUE)的PCRE正则表达式,允许在模式中使用外观:

> unlist(regmatches(x, regexpr("[[:alpha:]]+(?=\\.)", x, perl=TRUE)))
[1] "Rev"  "Miss"

在这里,(?=\\.)是一个积极的前瞻,需要在{1}之后的1+个字母,但在匹配中排除它。

<强>详情:

  • . - 字符串的开头
  • ^ - 任意多个字符,尽可能多到最后......
  • .* - 字边界
  • \\b - 第1组:一个或多个字母后跟文字([[:alpha:]]+\\.)
  • . - 字符串末尾的任何0 +字符。

使用TRE正则表达式,因此.*匹配包括换行符的任何字符。

此外,在您的代码中,.使用单个.进行转义,这会导致错误,因为\是一个错误的转义序列。必须使用双反斜杠定义正则表达式转义。