簡體   English   中英

在正則表達式中過濾單詞

[英]Filter words in Regular expression

因此,最近我接觸了 Python 中的正則表達式,並且在網上遇到了一些代碼,用於從包含在其他子字符串中的字符串列表中過濾單詞。

def Filter(string, substr):
    return [str for str in string
    if re.match(r'[^\d]+|^', str).group(0) in substr]

它看起來非常簡單,並且對於我遇到的特定問題效果很好,但我真的無法理解它的含義以及它是如何工作的。 這看起來很混亂。 任何人都可以像我是嬰兒之類的那樣向我解釋嗎? 我的編碼技能不是很好,而且我還是個菜鳥。

明確地說,代碼有效,我很高興繼續前進,我只是不明白這一點。

[^\d]匹配任何不是數字的字符; 這也可以寫成\D

+在模式之后表示匹配匹配模式的任何字符序列,因此[^\d]+匹配非數字序列。

| 分隔備選模式以進行匹配。

第二種選擇^匹配字符串的開頭。 每個字符串都會匹配這個。 我認為他們使用它只是為了避免匹配失敗,以便您始終可以在結果上調用.group(0) 他們可以通過在第一個選項中將+更改為*來完成相同的事情,因為這意味着匹配的序列可以是 0 次重復。

re.match()在參數字符串的開頭查找正則表達式的匹配項。 .group(0)返回與整個正則表達式匹配的內容。 所以這整個事情返回str中非數字的初始序列。

最后,列表理解返回strings中非數字初始序列在substr中的任何項目。

通過我上面提到的簡化,這可以重寫:

def Filter(string, substr):
    return [item for item in string
            if re.match(r'\D*', item).group(0) in substr]

請注意,如果任何項目以數字開頭,則正則表達式的結果將是一個空字符串,而空字符串是每個字符串的子字符串。 因此這些項目將包含在過濾結果中。 我懷疑這不是預期的結果。

我將盡力為您解釋這一點。

所以基本上我們正在創建一個名為“ filter ”的方法並傳遞兩個參數,即“ string (要搜索的)”和“ substring (要搜索的)”。 然后我們在python 返回函數中使用re.match以及for 循環中的if 條件(for 循環幫助我們一個一個地遍歷主字符串)。 至於: (r'[^\d]+|^' :這是一個正則表達式模式,其中 \d 是數字的正則表達式模式, + 表示至少一個或多個,最后它們在 () 內關閉,這意味着您要捕獲的組。

re.match: re.match 是一個函數,它只從字符串的開頭搜索並返回匹配的對象(如果找到)。 但是,如果在中間某處找到子字符串,則它只會返回 none。

暫無
暫無

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

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