regex: hamma so'zlarni aniq harflar bilan toping, ammo boshqa emas

Kimdir bu bilan menga yordam berishi mumkin:

[T OR d] va [k OR c] har qanday [s, z, n, m] har qanday harflardan iborat barcha so'zlarni topish kerak,

Men birinchi qismni o'ylab chiqdim, lekin to'xtatish ro'yxatini qanday kiritishni bilmayman:

\w*[t|d]\w*[k|c]\w*

Python belgisida

Oldindan rahmat

0
if (re.search ("[td]", input) yoki re.search ('[kc]' kiritish)) va re.search emas ('[sznm]', kiritish)
qo'shib qo'ydi muallif nhahtdh, manba
Joriy regex faqat t yoki d yoki k yoki c oldidan paydo bo'lgan so'zlarni topishi mumkin. Siz hohlaysiz?
qo'shib qo'ydi muallif jonrsharpe, manba
bir misol va kutilgan natijalar foydali bo'ladi
qo'shib qo'ydi muallif dragon2fly, manba
[t OR d] bilan nimani anglatadi? tried bilan mos keladimi?
qo'shib qo'ydi muallif Fermi paradox, manba

7 javoblar

2 bosqichdan foydalanishingiz mumkin. Avval T | D VA K | C toping, so'ngra nomaqbul harflar bilan mos keladigan narsalarni filtrlang.

Siz birinchi qismni o'ylaganingizdan beri, bu erda ikkinchi:

matches = [i for i in matches if not re.search(r'[sznm]', i)]    
print(matches) 
2
qo'shib qo'ydi

Based on answer of Padraic

EDIT We both missed this condition

[t OR d] va [k OR v]

bilan belgilanadi

Shunday qilib, - shunga mos ravishda o'rnatildi

s = "detected dot knight track"

allowed = ({"t","d"},{"k","c"})
forbidden = {"s","z","n", "m"}

for word in s.split():
    letter_set = set(word)
    if all(letter_set & a for a in allowed) and letter_set - forbidden == letter_set:
        print(word)

Va natija

detected
track
1
qo'shib qo'ydi
Rahmat, uzoq muddatda regex haqiqiy emas edi
qo'shib qo'ydi muallif AKarpun, manba
s = "foobar foo".split()

allowed = ({"k", "c"}, {"r", "d"})
forbid = {"s","c","z","m"}

for word in s:
    if all(any(k in st for k in word) for st in allowed) and all(k not in forbid for k in word):
        print(word)

Yoki set.intersection bilan kompilyator yordamida foydalanish:

words = [word for word in s if all(st.intersection(word) for st in allowed) and not denied.intersection(word)]
1
qo'shib qo'ydi

k yoki c oldidan paydo bo'lgan t yoki d kerak bo'lsa, quyidagi kodni kiriting: [^ sznm \ s \ d] * [td] [^ sznm \ s \ d] * [kc] [^ sznm \ s \ d] * .

[^sznm\s\d] means any character except z, n, m, s, whitespace characters (\s) or numbers (\d).

1
qo'shib qo'ydi
[Sznm] s, z, n, m dan boshqa barcha harflar bilan teng emas, degan ma'noni anglatadi ...
qo'shib qo'ydi muallif Mohsen, manba
OK, yangi tavsiya etilgan naqsh qabul qilinadi, ammo istisno qilingan belgilar.
qo'shib qo'ydi muallif Mohsen, manba
Yep, shuning uchun aniqlik, lekin men bo'shliq va sonlarni qo'shdim
qo'shib qo'ydi muallif Math, manba
Sizning yechimingiz ishlaydi, lekin butun bir oz murakkablashdi (bu mening masala), shuning uchun regexdan qochishga qaror qildim - rahmat
qo'shib qo'ydi muallif AKarpun, manba

Ko'rinishlardan foydalanishingiz kerak.

^(?=.*[td])(?!.*[sznm])\w*[kc]\w*$

ya'ni,

>>> l = ['fooktz', 'foocdm', 'foobar', 'kbard']
>>> [i for i in l if re.match(r'^(?=.*[td])(?!.*[sznm])\w*[kc]\w*$', i)]
['kbard']
0
qo'shib qo'ydi

Ushbu kodni kiriting:

import re
re.findall('[abcdefghijklopqrtuvwxy]*[td][abcdefghijklopqrtuvwxy]*[kc][abcdefghijklopqrtuvwxy]*', text)
0
qo'shib qo'ydi

Men, albatta, padraic-cunningham tomonidan javobni yoqtirmayman, lekin bu erda ishlamaydigan naqsh:

pattern = r'(?!\w*[sznm])(?=\w*[td])(?=\w*[kc])\w*'

Pozitif (? = ...) va salbiy (?! ...) ko'rinishdagi tasdiqlar python.org .

0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming