R中的模式替换

时间:2017-11-02 11:06:23

标签: r pattern-matching

在下面的例子中,我想用“lastName:Jordan”替换字符串“lastName:JordanlastName:Jordan”,即当模式重复时我想停止。我想为每条记录做这件事。如何在R?中做到这一点?

名字:波特诺伊

名字:JordanlastName:JordanlastName:约旦

名字:JordanlastName:JordanlastName:约旦

名字:CliffordlastName:CliffordlastName:克利福

名字:WalkerlastName:步行者

名字:波特诺伊

1 个答案:

答案 0 :(得分:1)

# Read in the example data:
x <- unname(unlist(c(read.table(text="lastName:Portnoy
lastName:JordanlastName:JordanlastName:Jordan
lastName:JordanlastName:JordanlastName:Jordan
lastName:CliffordlastName:CliffordlastName:Clifford
lastName:WalkerlastName:Walker
lastName:Portnoy", stringsAsFactors=FALSE))))
# Delete everything after the first occurrence of the pattern:
sub('(?<=[a-z])lastName[A-Za-z:]+', '', x, perl=TRUE)

[1] "lastName:Portnoy"  "lastName:Jordan"   "lastName:Jordan"  
[4] "lastName:Clifford" "lastName:Walker"   "lastName:Portnoy" 

这取代了&#34; lastName&#34;并且以下字符和冒号没有任何内容(&#39;&#39;)当且仅当之前有一封信。

详细

sub()有三个必填参数:patternreplacementx。我还使用了可选的perl=TRUE参数,因为我使用的pattern是一个Perl风格的正则表达式。我告诉sub()查看模式x的字符向量'(?<=[a-z])lastName[A-Za-z:]+',并将其替换为'',或者没有(相当于删除这些字符)。模式的(?<=[a-z])部分称为&#34;后视断言。&#34;这意味着当且仅当它在该模式之前找到一个字母时,该模式才匹配'lastName[A-Za-z:]+''lastName[A-Za-z:]+'查找确切的字符&#34; lastName&#34;紧接着是大写字母,小写字母和冒号字符集中的一个或多个字符。它匹配所有内容,直到找到不在该集合中的字符。