Python Regex,匹配多个子字符串

时间:2016-12-20 20:45:10

标签: python regex substring

我们有一个字典词典,如下所示:

    modelRE = {
       'APPLE':
            {
                'MAC MINI MA206LL/A': re.compile(r'^(?=.*\bMAC\b)(?=.*\bMINI\b)(?=.*\bMA206LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MAC MINI MC816LL/A': re.compile(r'^(?=.*\bMAC\b)(?=.*\bMINI\b)(?=.*\bMC816LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK AIR MD760LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bAIR\b)(?=.*\bMD760LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK AIR LINE': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bAIR\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO MC024LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bMC024LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO MD10xLL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bMD10xLL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO ME293LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bME293LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO ME294LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bME294LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO ME86xLL/A': re.compile(r'^(?=.*MACBOOK)(?=.*PRO)(?=.*ME86xLL/A).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO MF840LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bMF840LL/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO MJLT2LL/A': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bMJLT2LL\/A\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO Z0QN': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b)(?=.*\bZ0QN\b).*$', re.MULTILINE+re.IGNORECASE),
                'MACBOOK PRO LINE': re.compile(r'^(?=.*\bMACBOOK\b)(?=.*\bPRO\b).*$', re.MULTILINE+re.IGNORECASE)
            },
.
.
.

但是我们的正则表达式方法确实存在一些问题,你可以在这里看到一些实验。这个文档大约有7000行,因此我希望每次定义时保持正则表达式的一致性。

基本上,我们在700,000行计算机上规范化型号,受到已经标准化的制造商的限制。

我们也有这样的行(另一个实验):

'ELITEBOOK 2760P': re.compile(r'^(?=.*\b2760P\b)(Elite).*$', re.MULTILINE+re.IGNORECASE),

总而言之,我们希望在每个正则表达式中匹配多个子字符串。当我们' .search'正则表达式返回true时它,它必须包含任何顺序的子串。

例如(伪正则表达式):

substring(MAC) && substring(MINI) && substring(MA206LL/A) IN ANY ORDER

这应该匹配:

'MAC MINI MA206LL/A'
'MINI MAC MA206LL/A'
'MACMINI MA206LL/A'
'MAC-MINI-MA206LL/A'
'BIGMACandFRIES-MINI-MA206LL/A'
'MAC MINIMOUSE MA206LL/A'
'MAC MINI MA206LL/A-R321'

2 个答案:

答案 0 :(得分:1)

为什么不做一些字符串检查?

foo = 'MAC '
bar = 'MINI'
baz = 'MA206LL/A'

for item in modelRE['APPLE']:
    if foo in item and bar in item and baz in item:
        print(item)

答案 1 :(得分:0)

这是你如何做有效的包含和包含。

re.compile(' ^(?=。* ACE)(?=。 4710)。 $',re.MULTILINE + re.IGNORECASE)