[英]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.