Заменить индекс в строке - PullRequest
       1

Заменить индекс в строке

0 голосов
/ 19 сентября 2019

У меня есть следующий вектор, и я хочу заменить номера индексов (например, ₆, ₂) на «нормальные» числа.

vec = c("C₆H₄ClNO₂", "C₆H₆N₂O₂", "C₆H₅NO₃", "C₉H₁₀O₂", "C₈H₈O₃")

Я мог бы найти все значения индекса и заменить их по отдельности.:

gsub('₆', '6', vec)

Но нет ли для него шаблона в регулярном выражении?

Есть похожий вопрос для javascript, но я не смог перевести его на R.

Ответы [ 2 ]

5 голосов
/ 19 сентября 2019

Использование chartr:

Перевести символы в символьные векторы

Решение:

chartr("₀₁₂₃₄₅₆₇₈₉", "0123456789", vec)

См. online R demo

БОНУС

Для нормализации символов верхнего индекса используйте

chartr("⁰¹²³⁴⁵⁶⁷⁸⁹", "0123456789", "⁰¹²³⁴⁵⁶⁷⁸⁹")
## => [1] "0123456789"
3 голосов
/ 19 сентября 2019

Мы можем использовать str_replace_all из stringr, чтобы извлечь все числа индекса, преобразовать его в эквивалентное целое вычитание 8272 (потому что это разница между целочисленными значениями и 6 и всеми другими эквивалентами) и преобразовать его обратно.

stringr::str_replace_all(vec, "\\p{No}", function(m) intToUtf8(utf8ToInt(m) - 8272))
#[1] "C6H4ClNO2" "C6H6N2O2"  "C6H5NO3"   "C9H10O2"   "C8H8O3" 

Как указывает @Wiktor Stribiżew "\\p{No}" соответствует больше, чем цифры индекса, чтобы соответствовать только индексам от 0 до 9, которые мы можем использовать (благодаря @thothal)

str_replace_all(vec, "[\U2080-\U2089]", function(m) intToUtf8(utf8ToInt(m) - 8272))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...