Регулярное выражение в Python для сопоставления с шаблоном, который может иметь или не иметь некоторые части - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть несколько правил, которые должны удовлетворять передаваемой строке.Ниже приведены правила:

  1. Windows должна быть написана как «Windows», и не должно быть никаких торговых марок.

  2. Ни одно из слов не должно быть сокращено как «победа», «победа», «победа7», победа8, «победа10».Язык также в полной форме.Не «англ», это должен быть «английский».

  3. 64 бита, 32 бита и т. Д. Должны быть упомянуты перед языком и после слов «home» или «pro».

  4. Не должно быть «Microsoft» до ОС Windows.

  5. «Один язык / многоязычный» должен быть до 64 бит и после «Домой».

  6. В ОС, если упоминается Windows 10, но Home и Pro не упоминаются.Один из них должен быть упомянут.

Пример: Windows 10 home Single Language / Windows 10 pro / Windows 10 home Single Language 64 бит / Windows 10 home Single Language 64 бит Испанский / Windows 10 Pro Multi language 64 бит Английский,Испанский / Windows 10 home, один язык, 64 бит;это должно пройти.

Но Windows 10 / Microsoft Windows 10 / Windows 10 home 64-битная версия Single Language / Windows 10 home, 64-битная версия, Single Language / 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 bit, Single Language"что не должно происходить:

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)

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018
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 Home Single Language 64bit
Windows, 10 Home Single Language 64bit
Windows, 8.1 Professional Single Language 64bit
Windows, 10 Home, одноязычный 64-битный
Windows, 10 Home одноязычный 64-битный
Windows 8.1 Professional, многоязычный, 64-битный
Windows 8.1 Professional, многоязычный, 64-битный
Windows, 10 домашних одноязычный
Windows 10 home на одном языке
Windows 10 pro
Windows 10 home на одном языке 64-битный
Windows 10 home на одном языке 64-битный испанский
Windows 10 Pro на нескольких языках 64-битный английский, испанский
Windows 10 Pro Multi язык 64-битный английский, испанский, эсперанто
Windows 10 дома, один язык, 64-битный;

********* Не пройти:

Windows 10 Home, 64-битная, на одном языке
Windows 10 Microsoft Windows 10 Windows 10 home, 64-битная на одном языке
Windows 10 home, 64-разрядная, на одном языке Windows 7Домашний 64-битный мультиязычный

Для пояснения: 10 (?! [\ S,] Профессиональный) "?!"Отрицательный взгляд вперед, он будет соответствовать «10», но будет смотреть впереди него, и если он обнаружит, что Профессионал провалит совпадение.

Если вам нужно ввести другое правило, просто скажите мне

0 голосов
/ 11 сентября 2018

Как прокомментировал @Bernhard, ((\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)))?$'
...