字符串仅替换1个匹配组

时间:2018-04-22 17:07:33

标签: r regex

我有一个包含actor名称行的dataframe列,如下所示:

r = "c(\"Christian Slater\", \"Tara Reid\", \"Stephen Dorff\", \"Frank C. Turner\")"

我想用“。”之类的替换字符替换每个空格。天真,我以为我能做到这一点:

str_replace_all(r, "\\s", ".")

但是这也会在角色名称之间插入角色。

[1]“c(\”Christian.Slater \“,. \”Tara.Reid \“,。\”Stephen.Dorff \“,。\”Frank.C..Turner \“)”

我尝试过使用匹配组,但是我为什么这不起作用而感到头疼:

str_replace_all(r, "[:alpha:](\\s)[:alpha:]", "\\1.")

[1]“c(\”Christia .later \“,\”Tar .eid \“,\”Stephe .orff \“,\”Fran .. Turner \“)”

任何人都可以解释为什么我与正确的角色不匹配?另一个小问题是我需要正确匹配“。”具有中间首字母的名称的字符,但我认为在基本案例工作之后这将很容易。

2 个答案:

答案 0 :(得分:0)

我们可以使用正则表达式外观替换任何不是逗号(,)的字符后的空格

str_replace_all(r, "(?<!,)\\s+", ".")
#[1] "c(\"Christian.Slater\", \"Tara.Reid\", \"Stephen.Dorff\", \"Frank.C..Turner\")"

或者使用.

替换小写字符后的空格
str_replace_all(r, "(?<=[a-z])\\s", ".")
#[1] "c(\"Christian.Slater\", \"Tara.Reid\", \"Stephen.Dorff\", \"Frank.C. Turner\")"

或者可能是

str_replace_all(r, "(?<=[A-Za-z])\\.*\\s", ".")
#[1] "c(\"Christian.Slater\", \"Tara.Reid\", \"Stephen.Dorff\", \"Frank.C.Turner\")"

注意:目前尚不清楚预期的输出

答案 1 :(得分:0)

我相信只想要一个。什么时候已经有了。所以

str_replace_all(r, "([:alpha:])\\.?\\s", "\\1.")
[1] "c(\"Christian.Slater\", \"Tara.Reid\", \"Stephen.Dorff\", \"Frank.C.Turner\")"