Rvest/Stringr: 删除不可见符号拆分词?

Rvest/Stringr: Remove invisible symbols splitting words?

我正在检测带有 stringrregex 的单词,发现我遗漏了几个项目,因为当有换行符时单词会被拆分。

令人惊讶的是,当我打印单元格的内容或在 RStudio 的数据查看器中查看时,打断单词的符号是不可见的。我只能看到在复制粘贴内容时单词被拆分了。数据框的单元格进入控制台。单词之间有一个小点分隔,例如Schallenberg 表示为 Schallen[dot]berg(一个小点,垂直在直线中间);

我假设拆分单词的符号的不可见性与文本的来源有关。它们是通过 rvest 检索到的。然而,更惊人的是,当我在网站上查看包含该符号的单词时,它们并没有被拆分。

我的问题:如何删除这些不可见的符号?它们不会被删除 stringr::str_squish. 当我已经从网站上提取文本时,我是否必须考虑它们?非常感谢!

library(rvest, quietly = T, warn.conflicts = F)
library(tidyverse, quietly = T, warn.conflicts = F)

web_link <- "https://www.parlament.gv.at//PAKT/VHG/XXVII/NRSITZ/NRSITZ_00006/fnameorig_797359.html"

df_txt <- web_link %>% 
  read_html(., encoding = "latin1") %>% 
  html_nodes("body > div.WordSection37 > p:nth-child(2) > b:nth-child(2) > span") %>%
  html_text2() %>% 
  enframe(name = NULL,
          value="text_raw") %>% 
  mutate(text_raw=text_raw %>% str_squish %>% str_trim(., "both")) 

# There is a dot between Schallen - berg, but it's not visible
print(df_txt$text_raw)
#> [1] "Bundesminister für Europa, Integration und Äußeres Mag. Alexander Schallen­berg, LL.M."

str_detect(df_txt$text_raw, "Schallenberg") #false
#> [1] FALSE

reprex package (v1.0.0)

于 2021-04-08 创建

您输入的这个字符是soft hyphen\xAD。它属于 Other, format Unicode 控制字符类别。所以,你可以使用

gsub("\p{Cf}+", "", df_txt$text_raw, perl=TRUE)

或者,stringr:

stringr::str_remove_all(df_txt$text_raw, "\p{Cf}+")
stringr::str_replace_all(df_txt$text_raw, "\p{Cf}+", "")

注意:这不会删除所有不可见的字符。您可能想要删除除常见换行符 \r\n 之外的任何控制字符。在这种情况下,您宁愿使用

gsub("[^\P{C}\r\n]+", "", "a\n\r\b", perl=TRUE)
stringr::str_remove_all(df_txt$text_raw, "[^\P{C}\r\n]+")
stringr::str_replace_all(df_txt$text_raw, "[^\P{C}\r\n]+", "")

其中 [^\P{C}\r\n]+ 是一个取反字符 class,它匹配除非控制字符、CR 和 LF 字符以外的任何字符(也就是说,它匹配任何控制字符,但 \r\n 个字符)。