首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的正则表达式,用于匹配可能有或可能没有某些部分的模式

Python中的正则表达式,用于匹配可能有或可能没有某些部分的模式
EN

Stack Overflow用户
提问于 2018-09-11 04:57:19
回答 2查看 231关注 0票数 2

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

  1. Windows应该写成“Windows”,不应该有任何商标。
  2. 所有这些词都不应缩写为“win”、“wins”、“win7”、win8、“win10”。语言也有完整的形式。不是“英语”,应该是英语。
  3. 64位、32位等应在语言之前和“home”或“pro”之后提及。
  4. Windows操作系统之前不应该有“Microsoft”。
  5. “单一语言/多语言”应在64位之前和“Home”之后。
  6. 在操作系统中,如果提到Windows 10,但是没有提到Home和Pro。必须提到其中之一。

示例: 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位多语言;这些都不应该通过。

注:通过的基本标准是:

代码语言:javascript
复制
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位,单一语言“,这是不应该发生的:

代码语言:javascript
复制
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)))?'

最后,我写了这篇文章,现在它似乎正在工作,但这可能很少有测试用例失败:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 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部分匹配。

您应该使用^$来确保正则表达式与整个字符串匹配:

代码语言:javascript
复制
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)))?$'
票数 1
EN

Stack Overflow用户

发布于 2018-09-11 09:27:35

代码语言:javascript
复制
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“,但将向前看,如果它发现一个专业人员将失败的比赛。

如果你需要引入另一个规则,就告诉我

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52268914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档