![](/img/trans.png)
[英]Regular expression in python to capture between everything between 2 words
[英]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.