regex: নির্দিষ্ট অক্ষর কিন্তু অন্যান্য নয় সব শব্দ খুঁজে

যে কেউ আমাকে সাহায্য করতে পারেন:

আমি অক্ষর [টি অথবা ডি] এবং [কে বা সি] থাকা তালিকা থেকে সমস্ত শব্দ খুঁজে বের করতে হবে কিন্তু [s, z, n, m]

আমি প্রথম অংশ খুঁজে figured, কিন্তু স্টপ তালিকা অন্তর্ভুক্ত কিভাবে জানি না:

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

পাইথন নোটেশন

তুমাকে অগ্রিম ধন্যবাদ

0
যদি (re.search ('[td]', ইনপুট) অথবা re.search ('[kc]', ইনপুট)) এবং re.search ('[sznm]', ইনপুট না)
যোগ লেখক nhahtdh, উৎস
মনে রাখবেন যে আপনার বর্তমান রেজেকক্স শুধুমাত্র t বা d শব্দগুলি k বা c এর আগেই উপস্থিত হবে - এটি কি তুমি চাও?
যোগ লেখক jonrsharpe, উৎস
একটি উদাহরণ এবং আপনার প্রত্যাশিত ফলাফল সহায়ক হবে
যোগ লেখক dragon2fly, উৎস
আপনি [t বা d] দ্বারা কী বোঝাতে চান? চেষ্টা করে একটি ম্যাচ হবে?
যোগ লেখক Fermi paradox, উৎস

7 উত্তর

আপনি 2 পদক্ষেপ ব্যবহার করতে পারেন। প্রথমে টি | ডি এবং কে | সি সন্ধান করুন, তারপর অযাচিত অক্ষরগুলির সাথে মিল ফিল্টার করুন।

যেহেতু আপনি বলেছিলেন যে আপনি প্রথম অংশটি খুঁজে পেয়েছেন, এখানে দ্বিতীয়টি রয়েছে:

matches = [i for i in matches if not re.search(r'[sznm]', i)]    
print(matches) 
2
যোগ

Based on answer of Padraic

EDIT We both missed this condition

[t বা d] এবং [k অথবা c]

তাই - অনুযায়ী সংশোধন করা হয়েছে

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)

এবং ফলাফল হয়

detected
track
1
যোগ
ধন্যবাদ, regex দীর্ঘ রান সম্ভাব্য ধারণা ছিল না
যোগ লেখক AKarpun, উৎস
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)

অথবা set.intersection সঙ্গে একটি তালিকা কম্প ব্যবহার করে:

words = [word for word in s if all(st.intersection(word) for st in allowed) and not denied.intersection(word)]
1
যোগ

যদি আপনার t বা d k বা c এর আগে উপস্থিত হওয়া দরকার, তবে এটি ব্যবহার করুন: [^ sznm \ s \ d] * [td] [^ sznm \ s \ ঘ] * [KC] [^ sznm \ গুলি \ ঘ] * </কোড>।

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

1
যোগ
[^ sznm] s, z, n, m ব্যতীত সমস্ত অক্ষরের সমান নয় এর অর্থ এই যে শব্দের সংকেত স্পেস থাকতে পারে এবং ...
যোগ লেখক Mohsen, উৎস
ঠিক আছে, নতুন প্রস্তাবিত প্যাটার্নটি বেশি গ্রহণযোগ্য কিন্তু ব্যবধান ছাড়া নয়।
যোগ লেখক Mohsen, উৎস
হ্যাঁ, এইভাবে স্পষ্টতা, কিন্তু আমি সাদা স্থান এবং সংখ্যা যোগ
যোগ লেখক Math, উৎস
আপনার সমাধান কাজ করছে, কিন্তু এটি সম্পূর্ণ জটিল হয়ে উঠেছে (এটি আমার সমস্যা), তাই আমি রেজেক এড়াতে সিদ্ধান্ত নিলাম - ধন্যবাদ
যোগ লেখক AKarpun, উৎস

আপনি lookarounds ব্যবহার করতে হবে।

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

অর্থাত,

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

এই কোড ব্যবহার করুন:

import re
re.findall('[abcdefghijklopqrtuvwxy]*[td][abcdefghijklopqrtuvwxy]*[kc][abcdefghijklopqrtuvwxy]*', text)
0
যোগ

আমি সত্যিই @ পাদ্রিক-কানিংহামের উত্তরটি পছন্দ করি যা পুনরায় ব্যবহার করে না, কিন্তু এখানে একটি প্যাটার্ন, যা কাজ করবে:

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

ইতিবাচক (? = ...) এবং নেতিবাচক (?! ...) লুকানো দাবিগুলি ভালভাবে python.org

0
যোগ