【问题标题】:gsub, bracketed content occasionally bound by newline instead of closing bracketgsub,括号内的内容偶尔由换行符而不是右括号
【发布时间】:2018-01-28 18:22:25
【问题描述】:

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

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

  • [
  • 除右括号外的任何字符,0 次或多次
  • 可以是右括号,也可以是换行符\n

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

"[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 的一些东西在我试图处理元字符的方式上并不适用。任何建议将不胜感激。

【问题讨论】:

  • @smci 我非常欢迎任何对 HTML 抓取代码的 cmets 或批评;但现在我很高兴与当前的实施一起跛行。谢谢大家!
  • 我会发布答案
  • @omgitsjessie 当然。非常流行的 Python 包 BeautifulSoup 擅长解析损坏或不匹配的 HTML。如果你不喜欢 R,你可以尝试一下,或者至少用它来编写一个中间表示,然后你可以在 R 中进一步处理。
  • ...或者试试R package rvest,作者是多产的哈德利

标签: r regex web-scraping gsub


【解决方案1】:

您可以使用以下 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"

【讨论】:

  • 非常感谢,您拯救了这一天 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多