কেস রিসাইলে ছাড়া সংবেদনশীল নিয়মিত প্রকাশ?


331

পাইথনে, আমি কেস-সংবেদনশীল হতে একটি নিয়মিত প্রকাশটি সংকলন করতে পারি re.compile:

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>

একই উপায় আছে, কিন্তু ব্যবহার না করে re.compile। আমি ডকুমেন্টেশনে পার্লের iপ্রত্যয় (যেমন m/test/i) এর মতো কিছু খুঁজে পাচ্ছি না ।


1
নিয়মিত এক্সপ্রেসসোয়েন্সগুলির জন্য আপনি এখানে একটি চমৎকার ভূমিকা খুঁজে পেতে পারেন: পাইথন
কোর্স.ইউ

উত্তর:


562

পাশ re.IGNORECASEথেকে flagsএর PARAM search, matchঅথবা sub:

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)

2
re.match('test', 'TeSt', re.IGNORECASE)TypeErrorবৈশিষ্ট্য দুটি হচ্ছে যখন হতে পারে None। প্রথম_ স্ট্রিং == সেকেন্ড_স্ট্রিংয়ের মাধ্যমে ম্যাচ try & exceptধরতে ব্যবহার করা TypeErrorনমুনা কোড def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string ডেমো কোড
অভিজিৎ

3
@ অভিজিৎ আপনার ক্ষেত্রে সত্যিকার অর্থে চেষ্টা করা উচিত নয় except Noneপ্রথমে কোনও স্ট্রিং আছে কিনা তা পরীক্ষা করে দেখুন ।
এয়ার্ব

এটা তোলে নামে যুক্তি ব্যবহার করা জরুরী flagsজন্য re.subঅন্যথায় এটি পাসের re.IGNORECASEজন্য countযুক্তি (গুলি এছাড়াও। Stackoverflow.com/questions/42581/... )
L3n95

101

আপনি আইজিএনরেসেসি পতাকা ছাড়া পাইথন / ম্যাচ ব্যবহার করে সংবেদনশীল অনুসন্ধানগুলিও করতে পারেন (পাইথন ২.7.৩ এ পরীক্ষিত):

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'

2
ডকুমেন্টেশনে বৈশিষ্ট্যটি কোনও নির্দিষ্ট সংস্করণে যুক্ত হওয়ার কথা উল্লেখ করা হয়নি (যেমন (?(condition)yes|no)এটি বলা হয়েছে যে এটি ২.৪ এ যুক্ত হয়েছিল), তাই আমি আশা করি এটি reমডিউলটির প্রথম সংস্করণ থেকে পাওয়া যায় যা আমি মনে করি যে যুক্ত হয়েছিল 1.5 তে। মূলত পাইথনের ক্ষেত্রে যখন সমস্ত উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য সময় শুরু হয়। এটি এই পৃষ্ঠার প্রথম বিভাগের প্রায় অর্ধেক পথের সাথে নথিভুক্ত করা হয়েছে: ডকস.পিথথন.আর.

4
এখানে আমরা যাচ্ছি - আমি 1.5 নথির জন্য ডকুমেন্টেশন সন্ধান করেছি এবং এটি এই পৃষ্ঠার নিচে প্রায় 60% নথির নথিভুক্ত পেয়েছি: ডকস.পিথথন.আর.গ্রেস / 1.5.5 / লিবি / আমি ১.৪ ডকুমেন্টেশনও যাচাই করেছিলাম, যার কোনও উল্লেখ নেই made এই বৈশিষ্ট্য. সুতরাং আমি অনুমান করি যে এটি 1.5 যোগ করা হয়েছিল, যখন regexমডিউলটির পক্ষে মডিউলটিকে অবমূল্যায়ন করা হয়েছিল re
আর্টঅফ ওয়ারফেয়ার

3
এটি একটি দুর্দান্ত সমাধান কারণ এটিতে পতাকা লাগবে না। আমার ক্ষেত্রে আমি রেডিসে অনুসন্ধানের স্ট্রিংগুলি সঞ্চয় করছি এবং এটি সত্যই সহায়ক।
ব্যক্তিগত

3
@Private: ধারণার দিক থেকে এটা re.I পতাকা নির্ধারণ করে সমগ্র Regex - শুধু না ক্যাপচার গ্রুপ এটা পূর্বে। সচেতন থাকুন যা re.match(r'''A ((?i)B) C''', "a b c").group(0)কেবলমাত্র বি-তে নয়, সমস্ত কিছুর সাথে সংবেদন-সংবেদনশীল মিল সৃষ্টি করে (এ এবং সি)! আপনি যদি কেবলমাত্র একটি নির্দিষ্ট ক্যাপচার গ্রুপে কেস-ইনসেেন্স ম্যাচিং করতে চান তবে এটি আপনার অনুসন্ধান করা ড্রড নয়।
smci

1
@ প্রাইভেট: হ্যাঁ পুরোপুরি। আমার বক্তব্যটি ধারণাগতভাবে এটি পতাকা স্থাপনের সমান। পুরো রেজেক্সে। এমনকি এর আগে থাকা গোষ্ঠীগুলিও (!)। "কেবল নিম্নলিখিত ক্যাপচার গ্রুপগুলিতে কেস-সংবেদনশীল" বলার কোনও বাক্য গঠন নেই।
smci

53

কেস-সংবেদনশীল চিহ্নিতকারীকে (?i)সরাসরি রেজেক্স প্যাটার্নে অন্তর্ভুক্ত করা যেতে পারে:

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']

2
আরও ভাল বিকল্প, প্ল্যাটফর্মগুলি জুড়ে রেইজেক্সকে পোর্টেবল করে তোলে এবং ঘোষণায় অভিপ্রায়টি স্পষ্ট হয়
সিনা মাদানী

1
এই '(?i)'পদ্ধতিরও সুবিধা রয়েছে যে আপনি রেজিএক্সপেক্সের একটি তালিকা তৈরি করতে পারেন, যার কয়েকটি কেস-সংবেদনশীল এবং কিছু নয়। (এবং অবশ্যই, আপনি re.compileযদি চান তবে সেই তালিকার উপরে মানচিত্র
বানাতে

@ সিনাদাদানী আমি বিভ্রান্ত এর চেয়ে বেশি পোর্টেবল কীভাবে flags=re.IGNORECASE?
রোমেন ভিনসেন্ট

10

প্যাটার্ন সংকলনের সময় আপনি সংবেদনশীল কেস সংজ্ঞায়িত করতে পারেন:

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)

5
প্রশ্নে ওপি এটি ব্যবহার করে এবং এটি করার আরও একটি উপায় আছে কিনা তা জিজ্ঞাসা করে।
পিটার উড

6
দ্রুত স্ক্রোলিংগুলির জন্য সহায়ক।
স্টিভেক

6

আমদানিতে

import re

রান টাইম প্রসেসিংয়ে:

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

এটি উল্লেখ করা উচিত যে ব্যবহার না re.compileকরা অব্যর্থ। প্রতিবার উপরের ম্যাচ পদ্ধতিটি ডাকা হলে, নিয়মিত প্রকাশটি সংকলিত হবে be অন্যান্য প্রোগ্রামিং ভাষায় এটিও ত্রুটিপূর্ণ অনুশীলন। নীচে আরও ভাল অনুশীলন করা হয়।

অ্যাপের সূচনাতে:

self.RE_TEST = re.compile('test', re.IGNORECASE)

রান টাইম প্রসেসিংয়ে:

if self.RE_TEST.match('TeSt'):

1
ধন্যবাদ! সংকলনের বিষয়ে কেউ কখনও কথা বলেন না, তবুও এটি সবচেয়ে স্মার্ট বিকল্প!
স্টিফানজেকলিয়ার

2
ওপি আক্ষরিকভাবে এমন একটি সমাধান চেয়েছে যা ব্যবহার না করে re.compile()....
wpercy

4
#'re.IGNORECASE' for case insensitive results short form re.I
#'re.match' returns the first match located from the start of the string. 
#'re.search' returns location of the where the match is found 
#'re.compile' creates a regex object that can be used for multiple matches

 >>> s = r'TeSt'   
 >>> print (re.match(s, r'test123', re.I))
 <_sre.SRE_Match object; span=(0, 4), match='test'>
 # OR
 >>> pattern = re.compile(s, re.I)
 >>> print(pattern.match(r'test123'))
 <_sre.SRE_Match object; span=(0, 4), match='test'>

4

কেস-সংবেদনশীল ক্রিয়াকলাপ সম্পাদন করতে পুনরায় সরবরাহ করুন N

>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']

এবং যদি আমরা কেসের সাথে মেলে পাঠ্যটি প্রতিস্থাপন করতে চাই ...

>>> def matchcase(word):
        def replace(m):
            text = m.group()
            if text.isupper():
                return word.upper()
            elif text.islower():
                return word.lower()
            elif text[0].isupper():
                return word.capitalize()
            else:
                return word
        return replace

>>> re.sub('text', matchcase('word'), test, flags=re.IGNORECASE)
'UPPER WORD, lower word, Mixed Word'

1

আপনি যদি প্রতিস্থাপন করতে চান তবে তবুও পূর্ববর্তী স্ট্রিংয়ের স্টাইলটি রাখছেন। এটা সম্ভব.

উদাহরণস্বরূপ: "টেস্ট এসিডাসড টেস্ট এসটিড টেস্ট এ্যাসেডাসড" স্ট্রিংটি হাইলাইট করুন।

sentence = "test asdasd TEST asd tEst asdasd"
result = re.sub(
  '(test)', 
  r'<b>\1</b>',  # \1 here indicates first matching group.
  sentence, 
  flags=re.IGNORECASE)

পরীক্ষা asdasd পরীক্ষা ASD পরীক্ষা asdasd


0

কেস সংবেদনশীল নিয়মিত অভিব্যক্তির জন্য (রেজেক্স): আপনার কোডে যুক্ত করে দুটি উপায় রয়েছে:

  1. flags=re.IGNORECASE

    Regx3GList = re.search("(WCDMA:)((\d*)(,?))*", txt, **re.IGNORECASE**)
  2. কেস-সংবেদনশীল চিহ্নিতকারী (?i)

    Regx3GList = re.search("**(?i)**(WCDMA:)((\d*)(,?))*", txt)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.