我正在尝试编写一个简单的脚本,该脚本遍历输入字符串并将字符串中的所有数字转换为带下标的数字。
这是我最近一次尝试遍历输入字符串item
,并应创建一个包含下标数字的新字符串代替原始字符串中的数字的尝试。也许这是不可能的,但是我似乎无法结合unicode和格式化字符串文字表达式来完成这项工作。
item= 'H2O'
new=[]
sub = u'\u208'
for i,x in enumerate(item):
if x.isdigit():
sub=u'{x}'.format(sub)
new.append(sub)
else:
new.append(x)
new=''.join(new)
new
我收到以下错误:
File "<ipython-input-48-1d7d4a7394db>", line 4
sub = u'\u208'
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-4: truncated \uXXXX escape
最后,我想进行以下“转换”以获得输入字符串(H₂O
)的“带数字下标”版本(H2O
):
H2O --> H₂O
关于我在做什么错的任何想法,或者是否有更好的方法可以做到这一点?谢谢!
您可以使用str.maketrans()
。
[u'\u2080'
至u'\u2089'
表示从0到9的数字
sub=str.maketrans("0123456789", "₀₁₂₃₄₅₆₇₈₉")
_str='C3H8O3'
_str=_str.translate(sub)
print(_str)
输出
'C₃H₈O₃'
在您的代码中,sub=u'\u208'
应为sub=u'\u2082'
。简单的替换就足够了。
_str='H2O'
sub=u'\u2082'
for char in _str:
if char.isdigit():
_str=_str.replace(char,sub)
print(_str)
'H₂O'
[从方法论的角度来看,可以将操作减少两个两步。我认为这也有助于提高可读性,并且如果将来需要的话,还可以让您更轻松地对操作进行矢量化:
>>> mapping = {"0": "₀", "1": "₁", "2": "₂", "3": "₃", "4": "₄",
"5": "₅", "6": "₆", "7": "₇", "8": "₈", "9": "₉"}
>>> formula = "CH3CH2CH2CH3"
>>> "".join([mapping.get(x) or x for x in list(formula)])
'CH₃CH₂CH₂CH₃'
关于您收到的unicode错误,我在jupyter中也收到相同的错误。但是直接将字符from wikipedia复制粘贴到我的笔记本单元中似乎可以解决此问题。
如果您想实际使用unicode代码,则好像您丢失了代码的最后一个字符。因此₀
应该是'\u2080'
(python3)或u'\u2080'
(python2),₁
是'\u2081'
,依此类推。