मुझे किसी विशिष्ट शब्द से मेल खाने के लिए रेगेक्स कैसे लिखना चाहिए?


21

मैं एक विशिष्ट regex काम करने की कोशिश कर रहा हूं, लेकिन मुझे वह नहीं मिल सकता है जो मुझे चाहिए।

मूल रूप से, मैं चाहता हूं कि वह ROCKET की तलाश करे। रेगेक्स को ऊपरी या निचले मामलों में ROCKET से मेल खाना चाहिए, और विराम के साथ या उसके बिना, लेकिन दूसरे शब्द के भाग के साथ नहीं। तो, रेगेक्स इनमें से किसी पर भी ट्रिगर होगा:

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

लेकिन ROCKET पर ट्रिगर नहीं है जब यह कुछ ऐसा पाया जाता है

Rocketeer
Sprocket

मैं इसे एक रेगेक्स जनरेटर का उपयोग करके ऑनलाइन प्राप्त करने की कोशिश कर रहा हूं, लेकिन मैं इसे बिल्कुल मिलान नहीं कर सकता।


1
यह उन [अपरिमित] स्थितियों में से एक है जहाँ सवाल स्टैक ओवरफ्लो के लिए बेहतर अनुकूल हो सकता है। एक भाषा और / या मंच प्रदान करना सुनिश्चित करें क्योंकि प्रत्येक भाषा की अपनी ख़ासियत होती हैं। उदाहरण के लिए, विंडोज। .Net और रेगेक्स वर्ग । (आमतौर पर, इसका दूसरा तरीका है। स्टैक ओवरफ्लो को डेवलपर्स से सैकड़ों ऑफ-टॉपिक प्रश्न मिलते हैं जो सुपर यूजर के लिए बेहतर अनुकूल हैं)।
jww

जवाबों:


14

मेरा सुझाव है कि MSDN नियमित अभिव्यक्ति त्वरित संदर्भ बुकमार्क करना

आप गैर-अल्फ़ान्यूमेरिक वर्णों से घिरे शब्द "रॉकेट" के लिए एक असंवेदनशील मैच हासिल करना चाहते हैं। एक regex जो काम करेगा:

\W*((?i)rocket(?-i))\W*

यह क्या करेगा शून्य या अधिक (*) गैर-अल्फ़ान्यूमेरिक (\ W) वर्णों की तलाश में, इसके बाद रॉकेट का एक असंवेदनशील संस्करण ((? I) रॉकेट (? - i) के बाद, शून्य या अधिक के बाद फिर से। *) गैर-अल्फ़ान्यूमेरिक वर्ण (\ W)। रॉकेट-मिलान शब्द के आसपास अतिरिक्त कोष्ठक मैच को एक अलग समूह को सौंपता है। रॉकेट शब्द इस प्रकार मैच ग्रुप 1 में होगा।

अद्यतन 1: मैट ने टिप्पणी में कहा कि इस रेगेक्स का उपयोग अजगर में किया जाना है। पायथन में थोड़ा अलग सिंटैक्स है। अजगर में एक ही परिणाम प्राप्त करने के लिए, इस रेगेक्स का उपयोग करें और re.IGNORECASEविकल्प को फ़ंक्शन compileया पास करें match

\W*(rocket)\W*

पर Regex101 इस "मैं" पाठ बॉक्स में regex इनपुट के बगल में दर्ज करके नकली जा सकता है।

UPDATE 2 इस्माइल ने उल्लेख किया है, कि रेगेक्स काफी सही नहीं है, क्योंकि यह "1rocket1" से मेल खा सकता है। उन्होंने एक बेहतर समाधान, अर्थात् पोस्ट किया

(?:^|\W)rocket(?:$|\W)


1
इसे regex testers ऑनलाइन ( उदाहरण के लिए regex101.com ) के साथ परीक्षण करना इसे अमान्य और मिलान नहीं किए गए उदाहरण स्ट्रिंग के रूप में दिखाता है जो मैं दर्ज करता हूं। यह एक अजगर लिपि के भाग के रूप में उपयोग करने का इरादा है। क्या इससे कोई फर्क पड़ता है कि इसे कैसे लिखा जाना चाहिए?
केफ्का

1
हाँ यह करता है। आप regex101.com पर देख सकते हैं कि आप शीर्ष बाईं ओर एक regex "स्वाद" चुन सकते हैं, अजगर थोड़ा अलग है। मैं अजगर के साथ अपने जवाब को अपडेट करूंगा।
Xaser

1
धन्यवाद। मुझे लगा कि रेगेक्स मूल रूप से स्वतंत्र भाषा थे।
केफ्का

1
उन्हें होना चाहिए, लेकिन मामूली कार्यान्वयन अंतर मौजूद हैं।
Xaser

2
और \W*(rocket)\W*मेल खाता है lrocketl। यह (?:^|\W)(rocket)(?:$|\W)(बिना *और आपको यह जांचना होगा कि क्या यह स्ट्रिंग की शुरुआत और / या अंत से मेल खाता है)।
इस्माइल मिगुएल

10

मुझे लगता है कि इस मामले में लुक-अहिदे ओवरकिल हैं, और आप ignorecaseविकल्प के साथ शब्द सीमाओं का उपयोग करना बेहतर होगा ,

\brocket\b

दूसरे शब्दों में, अजगर में:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']

तकनीकी रूप से, गैर-कैप्चरिंग समूह कोई लुकऑर्डर्स नहीं हैं, हालांकि / बी विकल्प इस्माईल के समाधान के समान सटीक परिणाम देता है, लेकिन थोड़ा अधिक सुरुचिपूर्ण हो सकता है।
Xaser

1

साथ grepऔर sed, आप उपयोग कर सकते हैं \<rocket\>। इसके साथ grep, -iविकल्प इसे केस-असंवेदनशील बना देगा ( i gnore case):

grep -i '\<rocket\>'

मैं सभी sedरेगीज़ केस-असंवेदनशील बनाने का कोई तरीका नहीं जानता , लेकिन हमेशा गुफा वाला रास्ता होता है:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'

0

केवल संपूर्ण शब्दों के लिए खोज का उपयोग करें विकल्प।

जहां तक ​​विराम चिह्नों का सवाल है, आप इसका जवाब तब तक नहीं दे सकते, जब तक आपको स्वाद / स्वाद का पता नहीं चल जाता।

यह एक बहुत पुराना धागा है, इसलिए किसी ऐसे व्यक्ति के लिए पोस्ट किया जाता है, जो बाद में जरूरत पड़ने पर उससे मुलाकात कर सके। धागे की उत्पत्ति करने वाले लोग शायद किसी और चीज़ में चले गए ... नहीं?


क्या whole words only optionउपयोग कर रहा है grepया php? क्षमा करें, लेकिन आपका उत्तर अन्य उत्तरों की तुलना में कोई अतिरिक्त मूल्य नहीं देता है।
टोटो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.