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

Python中的正则表达式,用于匹配可能包含某些部分或不包含某些部分的模式,python,regex,python-3.6,Python,Regex,Python 3.6,我有一些规则应该满足传递字符串的要求。规则如下: Windows应该写为“Windows”,并且不应该有任何商标 所有单词都不应缩写为“win”、“wins”、“win7”、“win8”和“win10”。语言也是完整的。没有“eng”,应该是“English” 64位、32位等应在语言之前和“home”或“pro”之后提及 Windows操作系统之前不应该有“Microsoft” “单语言/多语言”应在64位之前和“主”之后 在操作系统中,如果它提到了Windows 10,但没有提到Home和P

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

  • Windows应该写为“Windows”,并且不应该有任何商标

  • 所有单词都不应缩写为“win”、“wins”、“win7”、“win8”和“win10”。语言也是完整的。没有“eng”,应该是“English”

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

  • Windows操作系统之前不应该有“Microsoft”

  • “单语言/多语言”应在64位之前和“主”之后

  • 在操作系统中,如果它提到了Windows 10,但没有提到Home和Pro。必须提到其中一个

  • 示例:Windows 10 home单语言/Windows 10 pro/Windows 10 home单语言64位/Windows 10 home单语言64位西班牙语/Windows 10 pro多语言64位英语,西班牙语/Windows 10 home,单语言,64位;这些应该通过

    但Windows 10/Microsoft Windows 10/Windows 10 home 64位单语言/Windows 10 home 64位单语言/Windows 7 home 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)).  
    
    单语言/多语言可能存在,也可能不存在,但如果存在,则应位于home/pro之后和64/32位之前。64/32位可能存在,也可能不存在,但如果存在,则应位于单语言/多语言之后

    这是我想到的,但它传递了“Windows 10 home,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位))?
    都可以忽略,因为
    修饰符,所以
    Windows 10 Home,64位,单语言
    将匹配,但仅适用于
    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)))?$'
    
    它会过去的::

    Windows,10个家庭单语言64位
    Windows,10个家庭单语言 语言64位
    Windows,8.1专业单语言64位
    Windows,10个主屏幕,单语言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 Pro多语言64位英语,西班牙语
    Windows 10 Pro多语言64位英语、西班牙语、世界语
    Windows 10 家用,单语言,64位

    *********未通过:

    Windows 10 Home,64位,单语言
    Windows 10 Microsoft Windows 10 Windows 10 Home 64位单语言
    Windows 10 Home,64位,单语言Windows 7 Home 64位多语言

    解释一下: 10(?![\s,]专业人士) “?!”是一个消极的前瞻,它将匹配“10”,但将前瞻,如果它发现一个专业将失败的比赛


    如果您需要引入另一条规则,请告诉我您的示例不匹配,因为小写的
    home
    。如果我假设这是一个输入错误,那么只有
    windows10home,
    匹配,因为
    ((\s)?(单语言|多语言|\w)(\s(64位| 64位| 32位))?
    都可以被忽略,因为?修饰语。还编辑了您的文章以获得更好的格式。请尝试编辑该问题,以便StackOverflow的用户更容易理解。帮助人们帮助你谢谢@Bernhard。但既然它们不是强制性的,我不得不这么说,但我明白为什么那不起作用。这只会检查拼写是否正确。请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。嗨@halfer,很抱歉我不得不添加“紧急”。我今天有一个最后期限。我直到昨晚才意识到这一点,我一直在压力下工作以解决这个问题,我无法找到解决办法。这是我在stackoverflow发布的第一个问题,稍后会记住这一点。如果您或任何人能帮助我找到解决方案,我将不胜感激。谢谢并致歉。问题是,它不接受“Windows 10家庭单一语言”。64位部分不是强制性的,Single语言多语言部分也不是强制性的。但如果他们出现,他们应该遵守规则,即单/多语言后64位,home/pro后单/多语言。非常感谢@YOGO,这很有魅力。你能解释一下为什么“(?:32 | 64 | Quamtum笑话)”有“Quamtum笑话”?这只是个笑话,你可以删除它。享受。嘿@YOGO,我需要一些帮助!这应该接受“Windows 10 Pro 64位英语、西班牙语、世界语”。多语言/单一语言不是强制性的。非常感谢。如果有任何混淆,请告诉我。嗨,科蒂,这是最新的正则表达式:
    ^Windows[\s,]{1,2}(10(?)[\s,]Professional){7,8\.1][\s,]{1,2}(Home | Pro | Professional)($)([\s,]{1,2})(单语言|多语言)([\s,]{1,2}((?:32 | 64 | Quamtum)位的笑话-)?;?(([a-z']{4,}(,|$)+)($)
    Hey@YOGO,它放弃了Windows 10 Pro 64位英语“,“Windows 10 Home 64位英语“,”Windows 10 Pro 64位英语“,”Windows 10 Pro 64位英语“,”以Windows 10 Pro和第7代Intel\u00ae Core\u2122 i3-7130U处理器为特色。还包括4GB内存和500GB硬盘驱动器。\n“,”具有Windows 10 Pro和第8版
    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 = ""