Skip to main content
 首页 » 编程设计

python之Python 中用于匹配可能包含或不包含某些部分的模式的正则表达式

2024年09月07日36飞鱼

我有一些规则应该满足要传递的字符串。以下是规则:

  1. Windows应该写成“Windows”,不能有任何商标。

  2. 任何单词都不应缩写为“win”、“wins”、“win7”、“win8”、“win10”。语言也有完整的形式。没有“eng”,应该是“English”。

  3. 64 位、32 位等应在语言之前和“home”或“pro”之后提及。

  4. Windows 操作系统前不应出现“Microsoft”。

  5. “Single language/Multi language”应该在64位之前,在“Home”之后。

  6. 在操作系统中,如果它提到了 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)))?$'