2011-10-03 82 views
4

我想檢查字符串(產品名稱)包含單詞beta的位置,因爲我在正則表達式寫法中不太好: eg。需要python正則表達式來處理子字符串

"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' 

但是,如果產品名稱中包含有串測試初始化​​像「藏人產品」這個詞因此,上述正則表達式是分析測試和提高錯誤。我想處理這種情況。任何人都可以向我推薦一些正則表達式。

非常感謝。

+0

''beta在product_name.lower()' –

回答

0

我們應該覆蓋測試版名,其中正則表達式應該給比賽的所有案件。

所以我們開始用β-"Crome beta"的第一個例子寫模式:

' [Bb]eta' 

我們使用[BB]在第二位匹配Bb

第二個例子"Crome_beta"添加_作爲分隔符:

'[ _][Bb]eta' 

第三"Crome beta2"和第四"Crome_betaversion"實例由最後的regexp覆蓋。

第五示例"Crome 3beta"迫使我們改變圖案是這樣的:

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

其中\d爲[0-9]和*替代從\d0infinity元件允許。

第六個示例"CromeBeta2.3"顯示Beta可以沒有前面的_或空格,只是從大寫開始。因此,我們有|結構,該結構在Python一樣or運營商覆蓋它:

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

第七例子Beta Crome 4由至少正則表達式匹配的(因爲它與Beta開始)。但是,它也可以是beta Chrome 4,所以我們就這樣換着花樣:

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

我們不使用,因爲Beta^[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)(括號)。也沒有必要。它只會減慢正則表達式。

2

嘗試((?<![a-z])beta|cromebeta)。 (單詞beta前面沒有一個字母或全部單詞cromebeta)

我會從http://docs.python.org/library/re.html添加一段引言來解釋第一部分。

(?<!...)如果匹配字符串中的當前位置不匹配的前面 ....這就是所謂的負向後斷言。 與正向lookbehind斷言類似,所包含的模式必須只能匹配某些固定長度的字符串。以 負向後置斷言開頭的模式可能會在要搜索的 字符串的開頭匹配。

+0

'但是數據可以像這樣的「CromeBeta2.3」 – Shashi

+2

@Shashi然後你必須學會​​在問題中做出很好的例子,我很不靈活我的回答遵循問題中設定的規則 – xanatos

+0

是的,你是對的,謝謝你的幫助 – Shashi

0

好像你實際上在產品名稱字符串中有兩個概念:產品和版本,包含空白和下劃線的分隔符。使用正則表達式分割兩個概念,並僅在版本概念中搜索單詞beta

+0

實際上沒有上面的字符串只是產品名稱,但有一段時間產品版本插入產品名稱字符串,以檢查我需要正則表達式。 – Shashi

0
"[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 
相關問題