替换字符串中的下标数字
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_all
从stringr
中提取出所有的下标数,转换为等价整数减去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)
奖金
要规范化上标数字,请使用
chartr("⁰¹²³⁴⁵⁶⁷⁸⁹", "0123456789", "⁰¹²³⁴⁵⁶⁷⁸⁹")
## => [1] "0123456789"
我有以下向量,我想用 '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_all
从stringr
中提取出所有的下标数,转换为等价整数减去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)
奖金
要规范化上标数字,请使用
chartr("⁰¹²³⁴⁵⁶⁷⁸⁹", "0123456789", "⁰¹²³⁴⁵⁶⁷⁸⁹")
## => [1] "0123456789"