2010-07-02 22 views
8

मान लीजिए उसमें केवल एक ही साथ एक स्ट्रिंग से मेल खाते हैं वहाँ दो तार कर रहे हैं:अजगर regex: एक चरित्र

$1 off delicious ham. 
$1 off delicious $5 ham. 

अजगर में, मैं एक regex जब केवल एक स्ट्रिंग में $ है वहाँ से मेल खाता है कि हो सकता है? यानी, मैं आरई को पहले वाक्यांश पर मिलान करना चाहता हूं, लेकिन दूसरे पर नहीं। मैं कुछ ऐसा करने की कोशिश की: "। मैच है, जिसमें आपको एक $ और $ के लिए के अलावा कुछ के बाद"

re.search(r"\$[0-9]+.*!(\$)","$1 off delicious $5 ham.") 

..saying $$ उदाहरण पर कोई मिलान नहीं था, लेकिन $ उदाहरण पर कोई मिलान भी नहीं था।

अग्रिम धन्यवाद! जांच के लिए

सरल परीक्षण विधि:

def test(r): 
    s = ("$1 off $5 delicious ham","$1 off any delicious ham")  
    for x in s: 
    print x 
    print re.search(r,x,re.I) 
    print "" 
+2

स्ट्रिंग के '.count()' विधि का उपयोग क्यों न करें? –

+0

मैं जूते में एक आरई-होर्निंग एक उपकरण में हूं जो मुझे कोई अतिरिक्त तर्क जोड़ने नहीं देता है। तो मैं नहीं कर सकता "अगर गिनती (str," $ ")> 1: पास करें"। मुझे इस तरह की स्ट्रिंग पर अभी मिलान करने की आवश्यकता नहीं है। – Chris

उत्तर

11
>>> import re 
>>> onedollar = re.compile(r'^[^\$]*\$[^\$]*$') 
>>> onedollar.match('$1 off delicious ham.') 
<_sre.SRE_Match object at 0x7fe253c9c4a8> 
>>> onedollar.match('$1 off delicious $5 ham.') 
>>> 

regexp का ब्रेकडाउन:
^ एंकर स्ट्रिंग के शुरू में
[^\$]* शून्य या अधिक अक्षर हैं जो $
\$ मैच डॉलर चिन्ह नहीं हैं
[^\$]* शून्य या अधिक वर्ण जोनहीं हैं स्ट्रिंग के अंत में
$ एंकर

+0

शो-एन-टेल के लिए बोनस पॉइंट। क्या आपके पास यह वर्णन करने के लिए कुछ मिनट हैं कि क्या हो रहा है, यहां? – Chris

+0

0 या उससे अधिक गैर डॉलर के हस्ताक्षर एक डॉलर के बाद 0 या अधिक गैर डॉलर संकेत –

+0

वास्तव में बहुत उपयोगी है; धन्यवाद। – Chris

1
re.search("^[^$]*\$[^$]*$",test_string) 
1
^.*?\$[^$]*$ 

इस चाल

+0

गैर-लालची मैच –

+0

हम्म का अच्छा उपयोग ..परीक्षण पास नहीं किया, हालांकि, जब तक कुछ विशेष झंडे की आवश्यकता नहीं होती है:

 >>> test(r"^.*?\$[^$]*$") $1 off $5 delicious ham <_sre.SRE_Match object at 0x00ED6288> $1 off any delicious ham <_sre.SRE_Match object at 0x00ED6288> 
Chris

2

बनाना चाहिए आप $ अलावा अन्य किसी भी चरित्र से मेल करने के एक चरित्र वर्ग [^] के पूरक उपयोग करना चाहते हैं:

re.match(r"\$[0-9]+[^\$]*$","$1 off delicious $5 ham.") 
  1. .*[^\$]* लाए गए:अपने मूल से परिवर्तन इस प्रकार हैं। नया शब्द [^\$] का अर्थ $
  2. $ स्ट्रिंग में जोड़ा गया कोई अन्य वर्ण है। मैच को स्ट्रिंग के अंत तक बढ़ाने के लिए मजबूर करता है।
  3. re.searchre.match के साथ बदल दिया गया। इसके किसी भी सबसेट की बजाय पूरी स्ट्रिंग से मेल खाता है।
+0

पास नहीं हुआ! >>> परीक्षण (r "\ $ [0-9] + [^ \ $] * $") $ 1 बंद $ 5 स्वादिष्ट हैम <_sre.SRE_Match 0x00ED65D0 पर वस्तु> $ 1 किसी भी स्वादिष्ट हैम बंद < 0x00ED65D0> – Chris

8
>>> '$1 off delicious $5 ham.'.count('$') 
2 
>>> '$1 off delicious ham.'.count('$') 
1 
+1

पर _sre.SRE_Match ऑब्जेक्ट मैं सहमत हूं, यहां एक नियमित अभिव्यक्ति अधिक हो जाएगी। – Duncan

संबंधित मुद्दे