簡體   English   中英

需要python正則表達式來處理子字符串

[英]Need python Regex for handling sub-string

我想檢查字符串(產品名稱)中包含單詞beta的位置,因為我對正則表達式的編寫不太滿意:例如。

"Crome beta"
"Crome_beta"
"Crome beta2"
"Crome_betaversion"
"Crome 3beta" 
"CromeBerta2.3"
"Beta Crome 4" 

這樣我就可以提出一個錯誤,那就是這不是有效的產品名稱,它是一個產品版本。 我寫了一個正則表達式,可以克服上述字符串

parse_beta = re.compile( "(beta)", re.I)
if re.search(parse_data, product_name):
     logging error 'Invalid product name'

但是,如果產品名稱中包含具有子字符串beta init的單詞,例如“ tibetans product”,那么上述正則表達式將解析beta並引發錯誤。 我想處理這種情況。任何人都可以建議我一些正則表達式。

非常感謝。

嘗試((?<![az])beta|cromebeta) (單詞beta之前沒有字母或完整單詞cromebeta)

我將在http://docs.python.org/library/re.html中添加一個引號,以解釋第一部分。

(?<!...)如果字符串中的當前位置之前沒有...的匹配項,則匹配。這稱為否定性后向斷言。 類似於肯定的后置斷言,所包含的模式必須僅匹配某個固定長度的字符串。 以否定的后向斷言開頭的模式可以在要搜索的字符串的開頭匹配。

似乎您在產品名稱字符串中實際上有兩個概念:產品和版本,從給出的示例中用空格和下划線分隔。 使用正則表達式將兩個概念分開,然后僅在版本概念中搜索單詞beta

"[Bb]eta(\d+|$|version)|^[Bb]eta "

用grep測試:

kent$  cat a                                            
Crome beta
Crome_beta
Crome beta2
Crome_betaversion
Crome 3beta
CromeBeta2.3
tibetans product
Beta Crome 4


kent$  grep -P "[Bb]eta(\d+|$|version)|^[Bb]eta " a     
Crome beta
Crome_beta
Crome beta2
Crome_betaversion
Crome 3beta
CromeBeta2.3
Beta Crome 4

我們應該涵蓋所有beta版本名稱的情況,其中regexp應該匹配。

因此,我們開始使用beta的第一個示例"Crome beta"編寫模式:

' [Bb]eta'

我們使用[Bb]來匹配Bb

第二個示例"Crome_beta"添加_作為分隔符:

'[ _][Bb]eta'

最后一個正則表達式涵蓋了第三個"Crome beta2"和第四個"Crome beta2" "Crome_betaversion"示例。

第五個示例"Crome 3beta"迫使我們以這種方式更改模式:

'[ _]\d*[Bb]eta'

\\d替代[0-9], *允許從0\\d infinity元素。

第六個示例"CromeBeta2.3"顯示Beta不能有任何_或空格,只能以大寫"CromeBeta2.3"開頭。 所以我們用| 與Python中的or運算符相同的構造:

'[ _]\d*[Bb]eta|Beta'

第七個示例Beta Crome 4由最小的正則表達式匹配(因為它以Beta開頭)。 但是它也可以是beta Chrome 4 ,因此我們可以通過以下方式更改模式:

'[ _]\d*[Bb]eta|Beta|^beta '

由於Beta已包含^[Bb]eta我們不使用^[Bb]eta

另外,我應該提到,我們不能使用re.I因為我們必須在正則表達式中區分betaBeta

因此,測試代碼為(對於Python 2.7):

from __future__ import print_function
import re, sys

match_tests = [
"Crome beta",
"Chrome Beta",
"Crome_beta",
"Crome beta2",
"Crome_betaversion",
"Crome 3beta" ,
"Crome 3Beta",
"CromeBeta2.3",
"Beta Crome 4",
"beta Chrome ",
"Cromebeta2.3" #no match,
"betamax" #no match,
"Betamax"]

compiled = re.compile(r'[ _]\d*[Bb]eta|Beta|^beta ')
for test in match_tests:
    search_result = compiled.search(test)
    if search_result is not None:
        print("{}: OK".format(test))
    else:
        print("{}: No match".format(test), file=sys.stderr)

我看不到需要使用否定的后向。 另外,您還使用了捕獲組(beta) (括號)。 也沒有必要。 這只會減慢正則表達式的速度。

暫無
暫無

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

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