Обнаружение (и замена) математических символов в строке

ТЛ;ДР; Как определить наличие математических символов в строке?

Я собираю много текстовых данных от других, через такие источники, как формы Google или непосредственно в электронных таблицах. Часто люди, вводящие данные, копируют текст откуда-то еще, например, с веб-страницы или PDF-файла, и вместе с текстом присутствуют математические символы.

Пример строки, в которой $\pi$ копируется как символ. "and π-d orbital"

R прекрасно читает это, а в коде уценки он даже прекрасно печатает/отображает это в формате HTML (см. пример). Однако мне нужно преобразовать это текстовое содержимое в PDF.

Что конечно Латексу не нравится и выдает следующую ошибку

! 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Установка negate = TRUE по сути означает вопрос: «Не содержит ли эта строка символов "[a-zA-Z]"?». Это вопрос, отличный от того, что вы хотите: «Включает ли эта строка какие-либо символы, которых нет в "[a-zA-Z]"?». Чтобы задать этот вопрос, используйте ^ внутри []. Обратите внимание, что вы также захотите включить пробелы, "-" и любые другие «приемлемые» символы.

stringr::str_detect("and π-d orbital", "[^\\s\\-a-zA-Z]")
# TRUE

Этого не хватает из-за того, что знаки препинания не являются математическими символами, но они будут отображаться как истинные.

Onyambu 18.04.2024 05:34

Вот почему я отмечаю, что ОП необходимо будет добавить любые другие символы, которые они считают приемлемыми, например знаки препинания.

zephryl 18.04.2024 05:42

Почему? Математический символ обычно представляет собой греческие буквы. Это будет намного ближе. например gsub("\\P{Greek}", "", "and π-d orbital", perl = TRUE) следует удалить все, что не греческое

Onyambu 18.04.2024 05:46

Это хороший подход, и я не знал, что таким образом можно идентифицировать греческие символы, поэтому спасибо, что научили меня. Почему бы вам не опубликовать это в качестве ответа?

zephryl 18.04.2024 05:58

Ну все равно не соответствует требованиям вопроса. Я могу перевести только в $p$, а не в $\pi$, что не является решением.

Onyambu 18.04.2024 06:06

@Onyambu --- ооооо... это. Это может быть другое решение/обходной путь. Если я могу отменить это предложение, чтобы превратить весь греческий в отсутствующий. И ДА, я не знал, что можно искать по греческому слову!

Robin Donatello 18.04.2024 06:12

Отрицание решения @Onyambu позволило мне «удалить» греческие буквы, что дает мне хорошее альтернативное решение, которое я могу реализовать. Мне не нужно искать/заменять греческий язык, если я могу показать исходному отправителю, где находятся его ошибки (заставьте его исправить!)

Я собираюсь отметить это как ответ, но также спасибо @zephryl за то, что научили меня отрицать регулярное выражение, что в конечном итоге привело меня к тому же месту.

вы можете использовать словарь со всеми греческими буквами и их названиями, чтобы заменить их соответствующим образом.

Onyambu 18.04.2024 07:05

Перепишите греческий словарь в LaTeX, например что из неофициального справочного руководства 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"

Если это не только греческий, можно включить и другие. Возможно, вам придется удалить обратную косую черту, в зависимости от ваших обстоятельств.

Другие вопросы по теме