R:困惑 使用 gsub 进行字符替换

问题描述 投票:0回答:2

我有很多这样的线条片段:

MYLINEBREAK01\r \r SURNAME, Name (LT)\r \r\nMYBREAK01

它来自于使用

rvest::html_text2()
处理大型 html 文件。长话短说 - 使用 xml2 解析器通过节点处理文件很笨重 - 需要太多时间。如果我剥离 HTML 文本,则该文本具有某些可以被利用的规律。例如,我已经插入了占位符 MYBREAK01 和 MYLINEBREAK01。当我试图摆脱不需要的
\r
\n
(可能散布着空格的回车符和换行符 - 或者至少它们看起来是空格)时,我有点不知所措。

我尝试将

%>% gsub()
放入应该删除这些字符的处理链中,但我在匹配时遇到问题,而且我不太知道我做错了什么:

gsub("(MYLINEBREAK01)(\r|\r\n| |\n)+([a-zA-Z ()]+)(\r|\r\n| \n)+(MYBREAK01)","\\1\\3\\5",.)

但它似乎与我想要的不匹配 - 字符串片段保持不变。而且(LT)型的东西并不总是出现在现场。当然,我的目标是获得

MYLINEBREAK01SURNAME, Name (LT)MYBREAK01
字符串 - 如果不存在,则没有 (LT)。

非常感谢!

r regex gsub
2个回答
0
投票

我认为这是 PCRE 的好时机

\v
。正如文档所述:

\v
匹配任何被视为垂直空白的字符;这包括平台的回车符和换行符(换行符)以及其他几个字符,全部列在下表中。

x <- "MYLINEBREAK01\r \r SURNAME, Name (LT)\r \r\nMYBREAK01"
gsub("\\v", "", x, perl = TRUE)
# [1] "MYLINEBREAK01  SURNAME, Name (LT) MYBREAK01"

看起来你想对间距做一些奇怪的事情。我们可以使用负向后查找来删除所有空格,除非它们前面有逗号。

gsub("\\v", "", x, perl = TRUE) |>
    gsub("(?<!,) ", "", x = _, perl = TRUE)

# [1] "MYLINEBREAK01SURNAME, Name(LT)MYBREAK01"

0
投票

听起来像是

stringr::str_squish()
的工作,这基本上是
gsub("\\s+", " ", s_) |> trimws()
的奇特名字。

s_ <- "MYLINEBREAK01\r \r SURNAME, Name (LT)\r \r\nMYBREAK01"
stringr::str_squish(s_)
#> [1] "MYLINEBREAK01 SURNAME, Name (LT) MYBREAK01"

# shich is basically 
gsub("\\s+", " ", s_) |> trimws()
#> [1] "MYLINEBREAK01 SURNAME, Name (LT) MYBREAK01"

rvest
注意:您可能会在这里遇到
html_text()
(sans-2),并通过
rvest
结合 CSS 选择器和/或 XPath 以及针对某些极端情况的一些
xml2
技巧来解决这个问题可能会简化您的任务。

© www.soinside.com 2019 - 2024. All rights reserved.