繁体   English   中英

需要python正则表达式来处理子字符串

[英]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]来匹配Bb

第二个示例"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因为我们必须在正则表达式中区分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) (括号)。 也没有必要。 这只会减慢正则表达式的速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM