我不确定如何将字符串后面的数字乘以字符串。我想找到一个化合物的RMM,所以我开始制作一个RMM字典然后将它们加在一起。我的问题是H2O等化合物。
name = input("Insert the name of a molecule/atom to find its RMM/RAM: ")
compound = re.sub('([A-Z])', r' \1', name)
Compound = compound.split(' ')
r = re.split('(\d+)', compound)
例如:
When name = H2O
Compound = ['', 'H2', 'O']
r = ['H', '2', 'O']
我想将H乘以2得到一个值“['H','H','O']。”
TLDR:我希望列表中的名称后面的整数打印先前列出的对象'x'次数(例如[O,2] =&gt; OO,[C,O,2] =&gt; COO)< / p>
这个问题有点复杂,所以如果我能澄清一下,请告诉我。感谢。
答案 0 :(得分:3)
定义compound
之后,以下内容如何:
test = re.findall('([a-zA-z]+)(\d*)', compound)
expand = [a*int(b) if len(b) > 0 else a for (a, b) in test]
匹配1个或多个实例的字母,后跟可选的数字位数 - 如果没有数字,我们只返回字母,如果有数字,我们将字母复制适当的值。这并没有完全回复你所期望的 - 它会返回['HH', 'O']
- 所以如果这适合,请告诉我。
编辑:假设您的化合物使用由单个大写字母或单个大写字母组成的元素,后跟多个小写字母,您可以添加以下内容:
final = re.findall('[A-Z][a-z]*', ''.join(expand))
将每个元素作为列表中的单独条目返回,例如['H', 'H', 'O']
编辑2:假设我之前的编辑,我们实际上可以将整个事情简化为几行:
name = raw_input("Insert the name of a molecule/atom to find its RMM/RAM: ")
test = re.findall('([A-z][a-z]*)(\d*)', name)
final = re.findall('[A-Z][a-z]*', ''.join([a*int(b) if len(b) > 0 else a for (a, b) in test]))
答案 1 :(得分:2)
你可以做点像......
compound = 'h2o'
final = []
for x in range(len(compound)):
if compound[x].isdigit() and x != 0:
for count in range(int(compound[x])-1):
final.append(compound[x-1])
else:
final.append(compound[x])
答案 2 :(得分:1)
使用正则表达式和生成器函数:
import re
def multilpy_string(seq):
regex = re.compile("([a-zA-Z][0-9])|([a-zA-Z])")
for alnum, alpha in regex.findall(''.join(seq)):
if alnum:
for char in alnum[0] * int(alnum[1]):
yield char
else:
yield alpha
l = ['C', 'O', '2'] # ['C', 'O', 'O']
print(list(multilpy_string(l)))
我们使用''.join
将您的列表重新加入。然后我们编译一个正则表达式模式,匹配列表中的两种类型的字符串。如果字符串是一个字母,后跟一个数字,则将其放入一个组中。如果它是一个单一的数字,它就放在自己的组中。然后我们遍历每个组。如果我们在组中找到了某些东西,我们就会产生正确的值。
答案 3 :(得分:1)
以下是一些嵌套的理解,以便用两行完成:
In [1]: groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', 'H2O')]
In[2]: [c for cG in groups for c in cG]
Out[2]: ['H', 'H', 'O']
注意:我正在解构和重构字符串,所以这可能不是最有效的方法。
这是一个较长的例子:
In [2]: def findElements(molecule):
...: groups = [h*int(''.join(t)) if len(t) else h for h, *t in re.findall('[A-Z]\d*', molecule)]
...: return [c for cG in groups for c in cG]
In [3]: findElements("H2O5S7D")
Out[3]: ['H', 'H', 'O', 'O', 'O', 'O', 'O', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'D']
答案 4 :(得分:-1)
在python3中(我不知道python2)你可以简单地将字符串相乘。
例如:
mpirun -np 2 ./test
(0) start MEM: 53068 KB. MIN: 26528 MAX: 26540 AVG: 26534 Change: 0 KB
(0) end MEM: 53300 KB. MIN: 26632 MAX: 26668 AVG: 26650 Change: 232 KB
证明此信息有用:
print("H"*2) # HH
print(2*"H") # HH