我試圖拆分由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