You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

tidyr::separate_wider_regex是否支持多行正则标志(?m)或regex(..., multiline=TRUE)?

解决tidyr::separate_wider_regex处理多行文本的问题

正确实现代码

library(tibble)
library(tidyr)

tibble(x = 'a\nmultiline\ntext') %>% 
  separate_wider_regex(
    x,
    c(
      _ = '.*?',  # 下划线表示丢弃该匹配部分
      m = 'multiline',
      _ = '.*'
    ),
    regex_spec = regex(flags = 's')  # 开启DOTALL模式,让`.`匹配换行符
  )

运行后得到预期结果:

# A tibble: 1 × 1
  m         
  <chr>     
1 multiline

问题原因分析

  1. 正则标志设置错误:separate_wider_regex不支持在单个正则片段中嵌入(?m)这类模式标志,需通过regex_spec参数统一配置全局正则选项。
  2. 缺少DOTALL模式:默认正则中.不匹配换行符\n,原代码里的.*?只能匹配第一行的a,无法覆盖a\n部分,导致整个模式无法匹配完整字符串,触发报错。开启flags = 's'(DOTALL模式)后,.会匹配包括换行在内的所有字符,确保整个字符串被完整匹配。
  3. 多行模式(?m)并非必需:你的需求是捕获跨多行文本中的特定片段,多行模式仅作用于^和$(匹配每行首尾),此处不需要,真正需要的是让.匹配换行的DOTALL模式。

补充:若需同时使用多行模式

如果场景需要让^/$匹配每行首尾,可同时开启DOTALL和多行模式:

regex_spec = regex(flags = 'sm')

内容的提问来源于stack exchange,提问作者Dan Wilt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:13:00