替换字符串中的下标数字

Replace subscript number in string

我有以下向量,我想用 'normal' 数字替换下标数字(例如 ₆、₂)。

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

我可以查找所有下标值并单独替换它们:

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

但是正则表达式中没有它的模式吗?

javascript 有类似的 question,但我无法将其翻译成 R。

我们可以用str_replace_allstringr中提取出所有的下标数,转换为等价整数减去8272(因为那是[=15的整数值的差值) =] 和 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))

使用chartr:

Translate characters in character vectors

解决方案:

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

online R demo

奖金

要规范化上标数字,请使用

chartr("⁰¹²³⁴⁵⁶⁷⁸⁹", "0123456789", "⁰¹²³⁴⁵⁶⁷⁸⁹")
## => [1] "0123456789"