【问题标题】:Replace subscript number in string替换字符串中的下标数字
【发布时间】:2020-01-20 06:09:12
【问题描述】:

我有以下向量,我希望将下标数字(例如 ₆、2)替换为“正常”数字。

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

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

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

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

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

【问题讨论】:

  • chartr("₀₁₂₃₄₅₆₇₈₉", "0123456789", vec)
  • @WiktorStribiżew 这并不是真正的重复恕我直言,因为我要求在正则表达式中使用子/上标的模式。但是,是的,这是一种可能性。
  • 这里不需要正则表达式。 chartr 来自基础 R,在这里使用它。
  • 我认为这个问题与提议的副本有很大不同,这就是我投票取消删除并重新打开的原因。此外,chartr 太被低估了,值得我们更多的爱。

标签: r regex gsub subscript


【解决方案1】:

使用chartr:

翻译字符向量中的字符

解决方案:

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

online R demo

奖金

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

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

【讨论】:

    【解决方案2】:

    我们可以使用str_replace_all from 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))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2018-03-26
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2015-09-25
    相关资源
    最近更新 更多