Питондағы тұрақты өрнектер - көмек қажет

Көптеген басқа адамдар сияқты мұнда сұрақтар қойды, мен жақында Python бағдарламалауды бастадым. Мен айнымалы атауды (тізімде сақталған айнымалы атаулардың тізімін) шығарып алу үшін тұрақты өрнекті анықтауға тырысатын мәселеге тап болдым. Мен файлдан жолға түсетін кодтың бөлігін талдаймын. Мен айнымалы тізімді жасаймын:

>>> variable_list = ['var1', 'var2', 'var4_more', 'var3', 'var1_more']

re.compile дегенді екі var1 деп таппайды деп айтуға болмайды. Мен дәл сәйкестік жасағым келеді. Жоғарыдағы мысалға сәйкес var ештеңеге сәйкес келмеуі керек, var1 тізімнің тек бірінші элементіне сәйкес болуы керек.

Деп үміттенемін, бұл реакцияны басқа тізілімнің жоққа шығарылуымен біріктіруі мүмкін, бірақ мен бұл мәселені қалай шешуге болатынын білмеймін.

Жақсы, мен бір маңызды нәрсені жіберіп алғанымды байқадым. Айнымалылар тізімі жолдан жиналады, сондықтан var атына дейін бос орын болуы немесе кейіннен қол қоюы мүмкін. Нақтырақ айнымалы тізімдеме ұқсас болады

>>> variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']

Бұл жағдайда ол ең алдымен 3-ді тануы керек, бірақ соңғы нұсқасы var1.

1
Қосымша код және/немесе түсініктеме пайдалы болар еді. «Айнымалы атауды шығарып алу» деген не екенін білмейсіз. Айнымалы атауды алдын-ала білетін әрбір айнымалы мән үшін алдын-ала реттегіңіз жасалсын ба? Бұл жолдарда басқа заттар болуы мүмкін бе (мысалы: олар өрнектер болып табылады) немесе олар тек жарамдылықты тексеру үшін өзгерткіш атаулары ғана бар ма?
қосылды автор Laurence Gonsalves, көзі
Пожалуйста, кодын дұрыс пішімдеңіз.
қосылды автор agf, көзі
Айнымалы белгілі айнымалы мәндер тізімінен біреуі болуы керек, re.compile («(someregex)% s (someregex)», айнымалы) жасау сияқты бір нәрсе жасауды қалаймын: known_variables = ['var1', 'var2', ' var1_more '] белгілі_варифмдердегі айнымалы үшін:
қосылды автор petrovic, көзі

3 жауаптар

^ көмегімен тіркелуіңізді және $ , егер сізді дұрыс түсінбейтін болсам:

>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1']
>>> import re
>>> r = re.compile(r'^var1$')
>>> matches = [item for item in mylist if r.match(item)]
>>> print matches
['var1']

Сондықтан ^ var1 $ дәл var1 сәйкес келеді, бірақ var1_text немесе var1var1 . Сіз кейінгі болып табыласыз ба?


Сіздің түзетулеріңізді өңдеудің бір жолы ^ \ W * var1 \ W * $ (бұл жерде var1 - айнымалы атау болатын) болады. \ W стенографиясы кейіпкерлердің сыныбы сәйкес келмейтін нәрсеге сәйкес келеді. \ w класы және \ w - негізінен алфавиттік-цифрлы таңбалар және астыңғы сызық. * дегеніміз, бұл нөлге немесе бірнеше рет сәйкес болуы мүмкін. Нәтижесінде:

variable_list = [' var1;', 'var1 ;', 'var1)', 'var1_more']
>>> r = re.compile(r'^\W*var1\W*$')
>>> matches = [item for item in variable_list if r.match(item)]
>>> print matches
[' var1;', 'var1 ;', 'var1)']

Айнымалы атауды сыртқы заттарсыз қажет етсеңіз, оны басып, бірінші түсіру тобын шығаруға болады. Мұндай нәрсе, бәлкім, (бәлкім, сәл тиімсіз, regex сәйкес элементтерге екі рет жұмыс істейді):

>>> r = re.compile(r'^\W*(var1)\W*$')
>>> matches = [r.match(item).group(1) for item in variable_list if r.match(item)]
>>> print matches
['var1', 'var1', 'var1']
2
қосылды
@petrovic: Мен сіздің екінші мысалға қатысты түзетуді қостым.
қосылды автор eldarerathis, көзі
Мен мәселені біраз өзгертіп қойдым, бірақ әлі күнге дейін бұл менің алдымда сұраған сұрағым үшін жұмыс істеу керек.
қосылды автор petrovic, көзі
Рахмет, бұл мәселені шешеді. :)
қосылды автор petrovic, көзі

Егер сіз әдеттегі сөйлемдерді білуге ​​тырысып жатсаңыз, онда бұл пайдалы жұмбақ, мүмкін, егер сіз белгілі бір сөздің тізбесінде тұрғанын көргіңіз келсе:

>>> 'var1' in mylist
True
>>> 'var1 ' in mylist
False
0
қосылды
Мәселе файлдан тізім жасаған болар едім және сол жолдардың форматы туралы сенімді емеспін. Сіздің мысалыңызда 'var1' және 'var1' екеуі де маған керек нәрсеге сәйкес болуы керек.
қосылды автор petrovic, көзі

Регрессия матчында тым көп кеңейтпеуі мүмкін, бірақ сіз 'filter ()' салынғанын пайдалана аласыз:

filter(function, iterable) 

Мәселен, @eldarerathis ұсынған тізілімнің біреуін пайдаланып:

>>> mylist = ['var1', 'var2', 'var3_something', 'var1_text', 'var1var1']
>>> import re
>>> r = re.compile(r'^var1$')

>>> matches = filter(r.match, mylist)
['var1']

Немесе өзіңіздің сәйкестік функциясын қолданыңыз:

>>> def matcher(value):
>>>     ... match statement ...

>>> filter(matcher, mylist)
['var1']

Немесе лямбда көмегімен бұрынғы тізілімді жоққа шығарыңыз:

>>> filter(lambda x: not r.match(x), mylist)
['var2', 'var3_something', 'var1_text', 'var1var1']
0
қосылды