我正在使用 stringr
和 regex
检测单词,并注意到我丢失了几个项目,因为在换行时单词会被分割。
引人注目的是,当我打印单元格的内容或在 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 Schallenberg, LL.M."
str_detect(df_txt$text_raw, "Schallenberg") #false
#> [1] FALSE
由reprex package于2021年4月8日创建(v1.0.0)
最佳答案
您在输入中得到的这个字符是 soft hyphen , \xAD
。它属于其他格式
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]+
是一个否定字符类,它匹配除非控制字符、CR 和 LF 字符之外的任何字符(即,它匹配除 \r
和 \n
字符之外的任何控制字符。
关于Rvest/Stringr : Remove invisible symbols splitting words?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67000182/