gsub,括号内的内容偶尔由换行符而不是右括号绑定

gsub, bracketed content occasionally bound by newline instead of closing bracket

我正在尝试清理一些文本字符串,以便我可以干净地解析出一些脚本信息。对于这些表,括号中的信息表示脚本的位置或块注释。

我想获取所有括号内的信息,并删除括号及其包含的所有字符。工作中的问题在于,由于数据最初都是手动编写的,因此并非所有括号内的信息或注释实际上都有右括号。所以 - 我想确定:

示例数据,一个很长的字符串(我自己的缩写)。通常每个字符串都是一整集的脚本:

"[Bridge]\r\r\n\r\r\n SPOCK: Check the circuit. \r\r\n [Pike's Quarters \r\r\n BOYCE: Boyce here.\r\r\n"

我尝试了 gsub 的几种排列,主要是沿着这些方向:

    df$script <- gsub("\[[^\]]*[\]|\n]", " ", testdf$script)

我认为应该抓住的:

    \[         an open bracket
    [^\]]*     any character except for a closed bracket, 0 or more times
    [\]|\n]   either a closed bracket, or a new line metachar

但我每次都空着。我在该 gsub 行上尝试了其他变体,因为我的 regex-fu 阻碍了我。这些都已经尝试过了,我的字符串没有改变:

    df$script <- gsub("\[[^\]]*[\]\n]", " ", testdf$script)
    df$script <- gsub("\[[^\]]*[\]|\n]", " ", testdf$script)
    df$script <- gsub("\[[^\]]*[\](\n)]", " ", testdf$script)
    df$script <- gsub("\[[^\]]*[\]|(\n)]", " ", testdf$script)

我知道抓取正则表达式 HTML 可能会让我臭脸;不幸的是,这是我处理这个字符串的唯一工具。我在其他一些语言的正则表达式模拟器上取得了不同程度的成功,但是关于 R gsub 的一些东西并没有包含在我试图处理元字符的方式中。任何建议将不胜感激。

您可以使用以下 PCRE 正则表达式(将 perl=TRUE 参数传递给 gsub

\[[^]\r\n]*(?:]|\R)

参见regex demo

图案详情

  • \[ - 一个 [ 字符
  • [^]\r\n]* - ]、CR 和 LF
  • 以外的 0+ 个字符
  • (?:]|\R) - ] (]) 或 (|) 换行序列 (\R)

R demo:

x <- "[Bridge]\r\r\n\r\r\n SPOCK: Check the circuit. \r\r\n [Pike's Quarters \r\r\n BOYCE: Boyce here.\r\r\n"
x <- gsub("\[[^]\r\n]*(?:]|\R)", " ", x, perl=TRUE)
x
## => [1] " \r\r\n\r\r\n SPOCK: Check the circuit. \r\r\n  \r\n BOYCE: Boyce here.\r\r\n"