使用負前瞻/後面斷言
pattern = re.compile("(?<!\{)\{(?!\{).*?(?<!\})\}(?!\})")
pattern.sub("hello", input_string)
負前瞻/後面斷言允許您比較多的字符串,但不被視爲使用了字符串的一部分的比賽。在斷言之前還有一個正常的查看,只有當字符串IS在給定模式後面/之前時,纔會使字符串匹配。
這是混淆找了一下,在這裏它是在片:
"(?<!\{)" #Not preceded by a {
"\{" #A {
"(?!\{)" #Not followed by a {
".*?" #Any character(s) (non-greedy)
"(?<!\})" #Not preceded by a } (in reference to the next character)
"\}" #A }
"(?!\})" #Not followed by a }
所以,我們正在尋找一個{周圍沒有任何其他{的,其次是一些字符,然後是}沒有任何其他的}圍繞它。
通過使用負前視/後置斷言,我們將其壓縮爲單個正則表達式,該表達式將成功匹配字符串中任何位置的單個{}。
另外,請注意*是一個貪婪的運算符。它將盡可能匹配。如果您使用"\{.*\}"
,並且文本中有多個{}塊,則它們之間的所有內容都將與其一起進行處理。
「這是一些示例文本{塊1}更多文本,看着我消失{塊2}甚至更多的文本」
成爲
「這是一些示例文本你好甚至更多而不是文字」
「這是一些示例文本你好更多文本,看着我消失你好甚至更多的文本」
要得到我們需要使其非貪婪通過附加一個適當的輸出?
python文檔在呈現re庫方面做得很好,但真正學習的唯一方法是進行實驗。
你能給我一個如何在Python中做到這一點的例子嗎?我不太清楚我的理解。謝謝! – So8res 2009-05-20 16:56:55
我可以在大約一個小時內,但不是現在,對不起... – 2009-05-20 16:58:45