TL;DR; 如何检测字符串中是否存在数学符号?
我通过谷歌表单等来源或直接在电子表格中从其他人那里收集了大量文本数据。通常,进行数据输入的个人会从其他地方(例如网页或 PDF)复制文本,并且随文本一起出现数学符号。
示例字符串,其中 $\pi$ 被复制为符号。
"and π-d orbital"
R 可以完美地读取此内容,并且在 Markdown 代码中,它甚至可以以 HTML 格式完美地打印/显示它(请参阅示例)。但是,我需要将此文本内容呈现为 PDF。
这当然 Latex 不喜欢并抛出以下错误
! LaTeX Error: Unicode character μ (U+03BC)
not set up for use with LaTeX.
我想编写一些
gsub
/str_detect
类型代码来查找任何特殊字符,以便我可以用正确的乳胶符号替换它们:$\pi$
。
我尝试使用以下代码来检测非字母字符,但这不起作用(返回
FALSE
,意味着它没有检测到符号)。
stringr::str_detect("and π-d orbital", "[a-zA-Z]", negate = TRUE)
建议?有 LaTeX 解决方案吗?
设置
negate = TRUE
基本上是在说,“这个字符串 not 是否包含 "[a-zA-Z]"
中的任何字符?”。这是一个与您想要的不同的问题,即“该字符串是否包含 "[a-zA-Z]"
中没有的任何字符?”。要询问that问题,请在^
内使用[]
。请注意,您还需要包含空格、"-"
和任何其他“可接受的”字符。
stringr::str_detect("and π-d orbital", "[^\\s\\-a-zA-Z]")
# TRUE
否定@Onyambu的解决方案使我能够“删除”希腊字母 - 这为我提供了一个可以实施的良好替代解决方案。如果我可以向原始提交者展示他们的错误所在(让他们修复它!),我不需要需要查找/替换希腊语。
我将将此标记为已回答,但也感谢@zephryl 教我如何否定正则表达式 - 这最终让我到达了同一个地方。
非官方 LaTeX2e 参考手册。
> library(rvest)
> l <- 'https://latexref.xyz/Greek-letters.html'
> s <- html_table(read_html(l))[[1]][1:2] |> sapply(strsplit, ', ') |>
+ apply(1, data.frame) |> Reduce(f=rbind)
> x <- "and π-d orbital"
> stringi::stri_replace_all_fixed(x, s$Symbol, s$Command, vectorize_all=FALSE)
[1] "and \\pi-d orbital"
如果不仅仅是希腊语,您可以包括不同的。您可能需要删除反斜杠,具体取决于您的情况。