2011-10-03 62 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 
相关问题