[英]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]來匹配B
或b
。
第二個示例"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
因為我們必須在正則表達式中區分beta
和Beta
。
因此,測試代碼為(對於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.