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

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

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

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

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

  4. 在 Windows 操作系统之前不应该有“微软”。

  5. “单语言/多语言”应在 64 位之前,“家”之后。

  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)).

单/多语言可能存在也可能不存在,但如果存在,则应该在家庭/专业版之后和 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) ):

         

忽然笑
浏览 450回答 2
2回答

人到中年有点甜

由于修饰符,((\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)))?$'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python