【问题标题】:R / stringr: split string, but keep the delimiters in the outputR / stringr:拆分字符串,但在输出中保留分隔符
【发布时间】:2018-06-01 20:00:27
【问题描述】:

我试图搜索解决方案,但似乎没有明确的解决方案。
我尝试按空格和大写字母的模式分割字符串,并为此使用 stringr 包。

x <- "Foobar foobar, Foobar foobar"
str_split(x, " [:upper:]")

通常我会得到:

[[1]]
[1] "Foobar foobar," "oobar foobar"  

然而,我想得到的输出应该包括来自分隔符的字母:

[[1]]
[1] "Foobar foobar," "Foobar foobar"

在 stringr 中可能没有像反向引用这样的开箱即用解决方案,所以我很乐意得到任何帮助。

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    您可以使用 1+ 个空格,后面跟一个大写字母:

    > str_split(x, "\\s+(?=[[:upper:]])")
    [[1]]
    [1] "Foobar foobar," "Foobar foobar" 
    

    这里,

    • \\s+ - 1 个或多个空格
    • (?=[[:upper:]]) - 一个positive lookahead(一个非消耗模式),它只检查字符串中当前位置右侧的大写字母而不将其添加到匹配值中,因此,保留它在输出中。

    请注意,\s 匹配各种空白字符,而不仅仅是普通的常规空格。此外,it is safer 使用 [[:upper:]] 而不是 [:upper:] - 如果您打算将模式与其他正则表达式引擎(例如 PCRE)一起使用。

    【讨论】:

    • 非常感谢!这很容易解决,从来没有使用过这个正则表达式技巧。
    • @perechen 请注意,如果您需要在空格字符之前检查逗号,您也可以使用 akrun 的建议来使用后向查找 - (?&lt;=,): "(?&lt;=,)\\s+(?=[[:upper:]])"。此模式将匹配逗号和大写字母之间的 1+ 个空格。
    【解决方案2】:

    我们可以使用正则表达式环视来分割, 和大写字符之间的空格

    str_split(x, "(?<=,) (?=[A-Z])")[[1]]
    #[1] "Foobar foobar," "Foobar foobar" 
    

    【讨论】:

    • 谢谢你,这个很好,我实际上想在现实世界的任务中检查标点符号。
    猜你喜欢
    • 2018-12-23
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多