簡體   English   中英

Python正則表達式替換除特定單詞之外的所有內容

[英]Python regular expression to replace everything but specific words

我試圖用正則表達式執行以下操作:

import re
x = re.compile('[^(going)|^(you)]')    # words to replace
s = 'I am going home now, thank you.' # string to modify
print re.sub(x, '_', s)

我得到的結果是:

'_____going__o___no______n__you_'

我想要的結果是:

'_____going_________________you_'

因為^只能在括號[] ,所以這個結果是有意義的,但我不知道怎么回事。

我甚至試過'([^g][^o][^i][^n][^g])|([^y][^o][^u])'但它產生'_g_h___y_'

不像第一次出現那么簡單,因為除了^ inside [ ]之外,RE中沒有“not”,它只匹配一個字符(如你所發現的)。 這是我的解決方案:

import re

def subit(m):
    stuff, word = m.groups()
    return ("_" * len(stuff)) + word

s = 'I am going home now, thank you.' # string to modify

print re.sub(r'(.+?)(going|you|$)', subit, s)

得到:

_____going_________________you_

解釋。 RE本身(我總是使用原始字符串)匹配任何字符( .+ )中的一個或多個,但是非貪婪( ? )。 這是在第一個括號組(括號)中捕獲的。 接下來是“前進”或“你”或行尾( $ )。

subit是一個函數(你可以在合理范圍內調用它),每個替換都會調用它。 傳遞匹配對象 ,我們可以從中檢索捕獲的組。 第一組我們只需要長度,因為我們用下划線替換每個字符。 返回的字符串將替換匹配模式的字符串。

這是一種正則表達式方法:

>>> re.sub(r'(?!going|you)\b([\S\s]+?)(\b|$)', lambda x: (x.end() - x.start())*'_', s)
'_____going_________________you_'

這個想法是,當你處理單詞並且想要排除它們等時,你需要記住大多數正則表達式引擎(大多數使用傳統的NFA)按字符分析字符串。 在這里,因為你想要排除兩個單詞並想要使用否定前瞻,你需要將允許的字符串定義為單詞(使用單詞邊界),因為在sub中它用匹配的替換字符串替換匹配的模式,你不能只是通過_因為在那種情況下它將替換像I am一樣的3個下划線( I ,'','am')。 因此,您可以使用函數作為sub的第二個參數傳遞,並將_與要匹配的匹配字符串的長度相乘。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM