需要python正则表达式来处理子字符串
我想检查字符串(产品名称)包含单词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'
但是,如果产品名称中包含有串测试初始化像“藏人产品”这个词因此,上述正则表达式是分析测试和提高错误。我想处理这种情况。任何人都可以向我推荐一些正则表达式。
非常感谢。
我们应该覆盖测试版名,其中正则表达式应该给比赛的所有案件。
所以我们开始用β-"Crome beta"
的第一个例子写模式:
' [Bb]eta'
我们使用[BB]在第二位匹配B
或b
。
第二个例子"Crome_beta"
添加_
作为分隔符:
'[ _][Bb]eta'
第三"Crome beta2"
和第四"Crome_betaversion"
实例由最后的regexp覆盖。
第五示例"Crome 3beta"
迫使我们改变图案是这样的:
'[ _]\d*[Bb]eta'
其中\d
为[0-9]和*
替代从\d
0
到infinity
元件允许。
第六个示例"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
,因为我们必须在正则表达式中区分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)
(括号)。也没有必要。它只会减慢正则表达式。
尝试((?<![a-z])beta|cromebeta)
。 (单词beta前面没有一个字母或全部单词cromebeta)
我会从http://docs.python.org/library/re.html添加一段引言来解释第一部分。
(?<!...)如果匹配字符串中的当前位置不匹配的前面 ....这就是所谓的负向后断言。 与正向lookbehind断言类似,所包含的模式必须只能匹配某些固定长度的字符串。以 负向后置断言开头的模式可能会在要搜索的 字符串的开头匹配。
好像你实际上在产品名称字符串中有两个概念:产品和版本,包含空白和下划线的分隔符。使用正则表达式分割两个概念,并仅在版本概念中搜索单词beta
。
实际上没有上面的字符串只是产品名称,但有一段时间产品版本插入产品名称字符串,以检查我需要正则表达式。 – Shashi
"[Bb]eta(\d+|$|version)|^[Bb]eta "
测试使用grep:
kent$ cat a
Crome beta
Crome_beta
Crome beta2
Crome_betaversion
Crome 3beta
CromeBeta2.3
*s 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在product_name.lower()' –