在下面的例子中,我想用“lastName:Jordan”替换字符串“lastName:JordanlastName:Jordan”,即当模式重复时我想停止。我想为每条记录做这件事。如何在R?中做到这一点?
名字:波特诺伊
名字:JordanlastName:JordanlastName:约旦
名字:JordanlastName:JordanlastName:约旦
名字:CliffordlastName:CliffordlastName:克利福
名字:WalkerlastName:步行者
名字:波特诺伊
答案 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()
有三个必填参数:pattern
,replacement
和x
。我还使用了可选的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;紧接着是大写字母,小写字母和冒号字符集中的一个或多个字符。它匹配所有内容,直到找到不在该集合中的字符。