簡體   English   中英

在正則表達式“ *?”中使用非貪婪限定詞

[英]using non-greedy qualifiers in regular expression '*?'

我有一個基於python 2.7的程序,可以從用戶(作為文本文件)或直接在命令提示符下輸入。 然后,我必須驗證輸入以確保其格式正確(並在需要時使用代碼重新格式化)。

來自用戶的理想輸入將是用逗號分隔的單詞,例如"blade, coffeen, cardiac". 但是我想進行檢查以允許輸入格式為"blade, coffeen, , cardiac" "blade,,cofeen,cardiac" "blade coffeen cardiac"等。

這意味着我可能必須使用非貪婪的限定詞,例如*? 盡管我知道基本的正則表達式,但是這個特殊的*? 還不清楚。 現在,我正在使用input_string.split(',')然后使用input_string.split(' ')來說明各種情況,但是從某種程度上來說,它感覺太過Python和混亂了。 我還想知道是否存在我未曾想到的場景,這些場景會破壞生產中的代碼。

在互聯網上查看此鏈接 https://docs.python.org/2/howto/regex.html在解釋.*?做得很好.*? 可行,我想我是否使用[, ]*? ,可以解決我的問題。

我的問題是:
1.我可以使用[, ]*? 就我而言,考慮到我上面描述的三種可能的輸入情景?
正如我提到的,無論如何,在驗證之后我都會使用string.split(',')之后再使用string.split(' ') ,但是使用正則表達式檢查會使其更整潔。 無論如何,我想了解[, ]*?到底是[, ]*? 如果使用將表現。

是的,您可以使用[, ]*? 如果它是較大的正則表達式的一部分。 您也可以在這種情況下使用re.split() ,而不必單獨使用str.split()

但是,您不需要使用? 貪婪修飾符,因為您要顯式檢查用空格和逗號分隔的單詞 單詞字符本身不會匹配[, ]*集。 實際上,貪婪的匹配將提高匹配的性能,因為正則表達式將一次性獲取所有空格和逗號,而不是一次僅獲取一個,然后必須檢查模式的其余部分是否匹配。第一個空格或逗號,然后是下一個空格或逗號,依此類推。

因此,以下工作 ,但刪除? 使表達式更好地工作:

>>> import re
>>> test = "blade, coffeen,    , cardiac"
>>> re.search('blade[, ]*?coffeen[, ]*?cardiac', test)
<_sre.SRE_Match object at 0x100758c60>
>>> re.search('blade[, ]*coffeen[, ]*cardiac', test)
<_sre.SRE_Match object at 0x1026101d0>

當您嘗試使用re.split()而僅使用[, ]*?時,您會注意到問題[, ]*? 作為模式:

>>> import re
>>> test = "blade, coffeen,    , cardiac"
>>> re.split('[, ]*?', test)
['blade, coffeen,    , cardiac']

[, ]*?分割時[, ]*? ,即使寬度為零的字符串 (空字符串re.split()也會與表達式匹配,並且re.split()不會僅在空字符串上分割。 不貪心,零寬度的字符串滿足測試要求,並且正則表達式引擎不會再尋找更多內容。

您可以將其修改為使用+? (至少匹配一個或多個):

>>> re.split('[, ]+?', test)
['blade', '', 'coffeen', '', '', '', '', '', '', 'cardiac']

現在,您將在中間得到一系列完整的空字符串,因為它們將單詞之間的各種空格和逗號分隔開。

僅當我刪除非貪婪修飾符時,它才能正確地將您的選項拆分為一個列表,因為現在單詞之間的所有空格和逗號都匹配並且用於拆分:

>>> re.split('[, ]*', test)
['blade', 'coffeen', 'cardiac']

因此,不要擔心貪婪,當匹配邊界不會混淆或過度匹配的非常特定的字符子集時,不要擔心。

暫無
暫無

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

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