我试图拆分由whitespace, +, =
定界的化学反应的一般字符串,其中可能有任意数量的空格。这是一般情况,但我也需要它在()
内发现+
时,有条件地在括号字符()
上分割。用分隔符和条件拆分字符串
例如:
reaction= 'C5H6 + O = NC4H5 + CO + H'
应拆分,使得结果是
splitresult=['C5H6','O','NC4H5','CO','H']
此情况下,使用时filter(None,re.split('[\s+=]',reaction))
似乎简单。但现在有条件分裂。一些反应将有一个(+M)
,我也想分开,只留下M
。在这种情况下,总会有一个+M
括号
内部。例如:
reaction='C5H5 + H (+M)= C5H6 (+M)'
splitresult=['C5H5','H','M','C5H6','M']
然而,会有一些情况下,括号不会分隔符。在这些情况下,不会有+M
,但其他的东西并不重要。
例如:
reaction='C5H5 + HO2 = C5H5O(2,4) + OH'
splitresult=['C5H5','HO2','C5H5O(2,4)','OH']
我最好的猜测是使用负前瞻和回顾后,以匹配+M
,但我不知道如何把到这一点我上面使用了简单的情况下,正则表达式表达。我的直觉是使用类似filter(None,re.split('[(?<=M)\)\((?=\+)=+\s]',reaction))
。任何帮助深表感谢。
我没有固有的理由使用'findall'作为'split'。这正是首先想到的。我对正则表达式不是很熟悉,你能否详细说明你的模式匹配的方式(它如何捕捉'()')以及为''findall''split'使用不同的模式? – smbio
现在看看答案 –
完美。谢谢。 – smbio