【问题标题】:split by lookaround按环视分割
【发布时间】:2020-02-28 21:46:45
【问题描述】:

我想将字符串拆分为单独的字符,除了<> 包围的字符。因此<a>bc<d>e 将变为<a> b c <d> e。我尝试了(?<!<)(?!>),它似乎在正则表达式测试器中有效,但在 R 中的以下代码中无效。我做错了什么?

X = '<a>bc<d>e'
Y = '(?<!<)(?!>)'
unlist(strsplit(X,Y,perl=TRUE))
[1] "<" "a" ">" "b" "c" "<" "d" ">" "e"

【问题讨论】:

  • 这似乎与 Rs 正则表达式风格有关。你可以试试stringi::stri_split_regex(X, Y, omit_empty = TRUE)
  • 我为 Y 添加了一些积极的外观,这似乎可以解决问题。我猜 strsplit 不会分裂,除非你真的告诉它寻找那里的东西。 Y = '(?&lt;!&lt;)(?!&gt;)(?&lt;=.)(?=.)'
  • source code中,有一些关于空字符串匹配的提示:“小心:需要区分空(rm_eo == 0)和非空(rm_eo > 0)匹配。前一种情况,提取的token是下一个字符,否则就是匹配开始之前的所有内容,可能是空字符串(不是严格意义上的“token”)。"

标签: r regex regex-lookarounds strsplit


【解决方案1】:

使用积极的环顾四周而不是消极的环顾:

strsplit('<a>bc<d>e', '(?<=[^<])(?=[^>])', perl=TRUE)
## [[1]]
## [1] "<a>" "b"   "c"   "<d>" "e"  

请参阅R demo

详情

  • (?&lt;=[^&lt;]) - 正向向后看,需要在当前位置左侧紧邻 &lt; 以外的字符
  • (?=[^&gt;]) - 正向前瞻,需要在当前位置右侧紧邻 &gt; 以外的字符。

【讨论】:

    【解决方案2】:
    (<[^>]+>|\S)
    

    似乎有效。这会首先尝试将三角括号与它们包含的所有内容进行匹配,如果不匹配,则匹配单个字符。

    Example on Regex101

    regmatches(X, gregexpr("<[^>]+>|\\S",X))[[1]]
    #> [1] "<a>" "b"   "c"   "<d>" "e"  
    

    【讨论】:

    • 它可以工作,但它不适用于strsplit,它需要一个正则表达式作为分隔符,并且有一个特殊的情况来分割每个字符,我允许自己编辑你的帖子以使你的提案工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多