2015-02-10 52 views
0

我有一個字符串:括號中刪除文本,除非文本中包含關鍵字

的text1(密鑰)文本2

文本1(按鍵)文本2(其它文本)

[關鍵]文本。 。文字.. [其它文本]

我要重新用「括號」移動「其他文本」,但不能移動(鍵)和[鍵]。

(鍵),[鍵]將永遠是相同的。始終「關鍵」。

我有這樣的代碼,每一個括號,括號,大括號匹配這...

\(.*?\)|\[(.*?)\]|\{(.*?)\} 

我只是想從比賽排除[關鍵](鍵)。 這可能嗎?

謝謝。

+0

如果是固定的文本,而不是一個模式,你不需要正則表達式。 – Maroun 2015-02-10 07:31:42

+0

您的預期產出是? – 2015-02-10 07:32:03

+0

@codeMan否,'[^ key]'不匹配'k','e'或'y',而不是'key'作爲關鍵字。 – Maroun 2015-02-10 07:33:35

回答

0
[({\[](?!key).*?[)\]}] 

您可以this.See演示很容易做到這一點。

https://regex101.com/r/wX9fR1/23

textpop向上

import re 
p = re.compile(r'[({\[](?!key).*?[)\]}]', re.MULTILINE) 
test_str = "\n\n text1 (key) text2\n\n text1 (key) text2 (some other text)\n\n [key] text.. text.. [some other text]\n\n and so on\n" 
subst = "" 

result = re.sub(p, subst, test_str) 
+0

謝謝,它的工作原理。 – user3052737 2015-02-10 09:24:50

+0

@ user3052737很高興工作 – vks 2015-02-10 09:25:17

+0

爲什麼downvvoted ??????????? – vks 2015-02-10 10:10:01

0

您需要使用負向視向斷言。 \((?!key\))(.*?)\)負面超前\(斷言在(之後不存在字符串key)符號。如果是,則捕獲()括號內的內容。同樣的其他兩個括號也是如此。

>>> s = """text1 (key) text2 

text1 (key) text2 (some other text) {key} 

[key] text.. text.. [some other text]""" 
>>> re.findall(r'\((?!key\))(.*?)\)|\[(?!key\])(.*?)\]|\{(?!key\})(.*?)\}', s) 
[('some other text', '', ''), ('', 'some other text', '')] 
>>> m = re.findall(r'\((?!key\))(.*?)\)|\[(?!key\])(.*?)\]|\{(?!key\})(.*?)\}', s) 
>>> [j for i in m for j in i if j] 
['some other text', 'some other text'] 

DEMO

相關問題