我有一些规则应该满足要传递的字符串。以下是规则:
Windows应该写成“Windows”,不能有任何商标。
任何单词都不应缩写为“win”、“wins”、“win7”、“win8”、“win10”。语言也有完整的形式。没有“eng”,应该是“English”。
64 位、32 位等应在语言之前和“home”或“pro”之后提及。
Windows 操作系统前不应出现“Microsoft”。
“Single language/Multi language”应该在64位之前,在“Home”之后。
在操作系统中,如果它提到了 Windows 10 但没有提到 Home 和 Pro。必须提到其中之一。
示例:Windows 10 家庭单一语言/Windows 10 专业版/Windows 10 家庭单一语言 64 位/Windows 10 家庭单一语言 64 位西类牙语/Windows 10 专业版多语言 64 位英语,西类牙语/Windows 10 家庭,单一语言, 64 位;这些应该通过。
但 Windows 10/Microsoft Windows 10/Windows 10 home 64 bit Single Language/Windows 10 home, 64 bit, Single Language/Windows 7 Home 64 bit multi language;这些不应该通过。
注意:要传递的基本骨架是:
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)).
单一/多语言可能存在也可能不存在,但如果存在,它应该在 home/pro 之后和 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)
请您参考如下方法:
正如@Bernhard 评论的那样,((\s)?(单一语言|多语言|\w)(\s(64 位|64 位|32 位|32 位)))?由于 ? 修饰符,所有这些都可以被忽略,因此 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)))?$'
