2016-03-11 46 views
-1

所以我有一個字符串,它是這樣的:如何在Python中替換自包含的字符串?

C(=O)(CNCC(=O)O)O 

我想捕捉的字符串C(= O)(任何)O /或作爲事實上,C(O)(東西)= O /與例如字母A代替它 - 使代碼的輸出應該是其中之一(並沒有真正物質):

A(CNCA) 

A(CNCA)A 

到目前爲止,我已經能夠計算它的所有出現(但是過了好一會兒也行)與以下正則表達式:

len(re.findall(r'(?=C\(((O|=O))\)(\(.*\))?(=O|O)($|\)))', string)) 

然而,當我打印由re.findall創建的列表,它只有一些看似不一致的成員,所以我不能遍歷它來代替。 re.sub也沒有工作,我認爲積極的向前看起來很糟糕。另外,因爲匹配像(串)g,捕獲組似乎很難使用。

我該如何解決這樣的問題?

+2

你需要一個能算括號的事情。正則表達式在這裏可能不是正確的選擇。類似的原因,爲什麼你不能用正則表達式解析通用SGML。 –

+2

「,並用字母A代替它」 - 那爲什麼輸出不是簡單的'A'? –

+0

向我們展示替代代碼 –

回答

0

此程序可能爲你工作:

import re 
s = 'C(=O)(CNCC(=O)O)O' 
olds = None 
while s != olds: 
    olds = s 
    s = re.sub(r'C\(=O\)([^()]*)O', r'A\1', s) 
    s = re.sub(r'C\(=O\)(\([^()]*\))O', r'A\1', s) 
    s = re.sub(r'C\(O\)([^()]*)=O', r'A\1', s) 
    s = re.sub(r'C\(O\)(\([^()]*\))=O', r'A\1', s) 
print s 
相關問題