我有一些规则,可以满足传递字符串的要求。以下是规则:
示例: Windows 10 home单语言/ Windows 10 pro/Windows 10 home单语言64 bit/ Windows 10 home单语言64位西班牙语/ Windows 10 Pro多语言64位英语、西班牙语/ Windows 10 home、单语言64位;这些应该通过。
但是Windows 10/ Microsoft 10/ Windows 10家庭64位单语言/ Windows 10家庭64位,64位,单语言/ Windows 7家庭64位多语言;这些都不应该通过。
注:通过的基本标准是:
Windows(space or comma)(10 or 7 or 8.1)(space or comma)(home or pro or professional)(space or comma)(single language or multi language)(space or comma)(64 bit or 32 bit)(space or comma)(language(s)). 单/多语言可能存在,也可能不存在,但如果存在,则应该是在家庭/专业语言之后,或者在64/32位之前。64/32位可能存在,也可能不存在,但如果存在,则应采用单一/多语言。
这是我想出来的,但它通过了"Windows 10主页,64位,单一语言“,这是不应该发生的:
filter_exp = r'(Windows)\s(10)\s(Home\b|Pro\b)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?'
filter_exp1 = r'(Windows)\s(7|8.1)\s(Professional\b)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?'最后,我写了这篇文章,现在它似乎正在工作,但这可能很少有测试用例失败:
filter_exp = r'(Windows)\s(10)\s(Home|Pro)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?'
#filter_exp = r'^(Windows)\s(10)\s(Home\b|Pro\b)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?$'
filter_exp1 = r'(Windows)\s(7|8.1)\s(Professional)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?'
filter_exp3= r'(64bit|64-bit|32bit|32-bit)[\s,.]*(Single Language|Multi Language)'
filter_sym = u'Windows\N{REGISTERED SIGN}'
if ((re.findall(filter_exp, elem) or re.findall(filter_exp1, elem)) and not re.findall(filter_sym, elem) and not re.findall(filter_exp3,elem) ):
pass
else:
elem=' '.join(elem.split())
elem=elem+'\n'
ErrorList.append(elem)发布于 2018-09-11 06:05:55
正如@Bernhard所评论的那样,((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?都可以被忽略,因为?修饰符使Windows 10 Home, 64 bit, Single Language能够匹配,但只与Windows 10 Home部分匹配。
您应该使用^和$来确保正则表达式与整个字符串匹配:
filter_exp = r'^(Windows)\s(10)\s(Home\b|Pro\b)([$,\s\b])?((\s)?(Single Language|Multi Language|\w)(\s(64bit|64-bit|32bit|32-bit)))?$'发布于 2018-09-11 09:27:35
match = re.search(r"^Windows[\s,]{1,2}(10(?![\s,]Professional)|7|8\.1)[\s,]{1,2}(Home|Pro|Professional)($)?(([\s,]{1,2})?(Single Language|Multi Language)([\s,]{1,2}((?:32|64|Quamtum-joke)[\s-]?bit))?)?;?( ([a-z']{4,}(?# 4 or more characters per language 'thai|dari|urdu')(, |\r))+)?(\r|\n|$)", subject, re.IGNORECASE | re.MULTILINE)
if match:
result = match.group()
else:
result = ""它将通过::
Windows,10家庭单语言64位 Windows,10家庭单语言64位 Windows,8.1专业单语言64位Windows,10 Home,单语言64位 Windows,10家庭单语言64位 Windows 8.1专业人员,多语言,64位 Windows 8.1专业人员,多语言,64位 Windows,10种家庭单一语言 Windows 10家庭单一语言 Windows 10 pro Windows 10家庭单语言64位 Windows 10家庭单语言64位西班牙语 Windows 10专业多语言64位英语、西班牙语 Windows 10 Pro多语言64位英语、西班牙语、世界语 Windows 10家庭,单一语言,64位;
*未通过:
Windows 10家庭,64位,单一语言 Windows 10微软Windows 10 Windows 10家庭64位单语言 Windows 10家庭,64位,单语言Windows 7家庭64位多语言
解释一点:10(专业) "?!“是一个负面的前景,它将匹配"10“,但将向前看,如果它发现一个专业人员将失败的比赛。
如果你需要引入另一个规则,就告诉我
https://stackoverflow.com/questions/52268914
复制相似问题