2015-07-06 73 views
4

裏面我有一個這樣的字符串:選擇替換子字符串

a = "\"java jobs in delhi\" delhi" 

我想「取代德里」。但只有位於雙引號之外的德里。因此,輸出應該是這樣的:

"\"java jobs in delhi\"" 

的字符串是一個樣本string.The串不一定是「德里」 .The子更換可以在輸入字符串的任何地方發生。字符串中引用和未引用部分的順序和數量不固定

.replace()替換了這兩個delhi子字符串。我不能使用rstrip,因爲它不一定出現在字符串的末尾。我怎樣才能做到這一點?

+0

你想這樣做多次,或只是一次?因爲您可以通過執行[0:-6]來選擇子字符串 – DJanssens

+0

您是否考慮過正則表達式? – jonrsharpe

+0

這只是一個示例字符串。我覺得正則表達式是要走的路,但我無法爲此生成正則表達式。這個字符串也可以像''\「在pune \」pune「'中的java作業一樣。所以,我基本上在尋找一個通用的解決方案。 –

回答

3

使用re.sub

>>> a = "\"java jobs in delhi\" delhi" 
>>> re.sub(r'\bdelhi\b(?=(?:"[^"]*"|[^"])*$)', r'', a) 
'"java jobs in delhi" ' 
>>> re.sub(r'\bdelhi\b(?=(?:"[^"]*"|[^"])*$)', r'', a).strip() 
'"java jobs in delhi"' 

OR

>>> re.sub(r'("[^"]*")|delhi', lambda m: m.group(1) if m.group(1) else "", a) 
'"java jobs in delhi" ' 
>>> re.sub(r'("[^"]*")|delhi', lambda m: m.group(1) if m.group(1) else "", a).strip() 
'"java jobs in delhi"' 
+0

很好的答案。 –

0

您也可以使用re.split的一般方法和列表理解:

>>> a = "\"java jobs in delhi\" delhi \"another text\" and this" 
>>> sp=re.split(r'(\"[^"]*?\")',a) 
>>> ''.join([i.replace('dehli','') if '"' in i else i for i in sp]) 
'"java jobs in delhi" delhi "another text" and this' 

re.split()功能分割你的T基於子串分機已包圍"

['', '"java jobs in delhi"', ' delhi ', '"another text"', ' and this'] 

然後你就可以更換dehli話不與2雙引號包圍了!

0

這是另一種選擇。這是一個通用的解決方案,以消除任何不帶引號的文本:

def only_quoted_text(text): 
    output = [] 
    in_quotes=False 

    for letter in a: 
     if letter == '"': 
      in_quotes = not in_quotes 
      output.append(letter) 
     elif in_quotes: 
      output.append(letter) 

    return "".join(output) 


a = "list of \"java jobs in delhi\" delhi and \" python jobs in mumbai \" mumbai" 

print only_quoted_text(a) 

輸出將是:

"java jobs in delhi"" python jobs in mumbai " 

它還顯示文本,如果最終報價缺失。