एक स्ट्रिंग को देखते हुए, मुझे $ के बाद फ़ील्ड की पहचान करने की आवश्यकता है जो { } से घिरा हो या न हो:

$verb = verb
${verb}age = verb

$$ एक पलायन के रूप में कार्य करता है और मुझे इसका हिसाब देना होगा और साथ ही यह परिसीमन $ से पहले भी हो सकता है।

मेरे पास अब तक क्या है:

reg = r'\$([_a-zA-Z0-9]*)'
s = '$who likes $what'
re.findall(reg, s)
['who', 'what']

लेकिन मैं वैकल्पिक ब्रेसिंग के लिए अभिव्यक्ति तैयार नहीं कर सकता, मैंने कोशिश की:

reg = r'\$({?[_a-zA-Z0-9]*}?)'

लेकिन वह इस तरह के मूल्यों को उठाता है:

${who
$who}

वैकल्पिक ब्रेसिंग के लिए खाते में सक्षम होने के लिए उपयुक्त अभिव्यक्ति क्या होगी?

अपडेट करें:

जब पूर्ववर्ती $ की बात आती है, तो निम्नलिखित अमान्य तार होंगे:

$$verb = invalid
$${verb} = invalid

लेकिन ये मान्य होंगे:

$$$verb = $verb
$$${verb} = $verb

ऐसा इसलिए है क्योंकि एक $$ को बाद में एक $ से बदल दिया जाता है।

0
pasta_sauce 27 अक्टूबर 2020, 02:04

2 जवाब

सबसे बढ़िया उत्तर

यदि उद्घाटन { को समापन } के साथ मेल खाना चाहिए, तो आप एक विकल्प के साथ 2 कैप्चरिंग समूहों का उपयोग कर सकते हैं और फिर मान या तो समूह 1 या समूह 2 में होगा।

यदि $ से पहले कोई दूसरा $ नहीं होना चाहिए, तो आप सीधे बाईं ओर डॉलर चिह्न नहीं होने का दावा करते हुए एक नकारात्मक लुकबैक (?<!\$)\$ का उपयोग कर सकते हैं।

\$(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))\b

रेगेक्स डेमो

या केवल मान प्राप्त करने के लिए, आप लुकअराउंड के साथ एक विकल्प का उपयोग कर सकते हैं

(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})

रेगेक्स डेमो

import re

regex = r"(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})"
test_str = ("$verb = verb\n"
            "${verb}age = verb")

print(re.findall(regex, test_str))

उत्पादन

['verb', 'verb']

संपादित करें

अपडेट किए गए प्रश्न के लिए, उदाहरण के लिए कैप्चरिंग समूहों का उपयोग करके, आप या तो एक या 3 या अधिक डॉलर के संकेतों का मिलान कर सकते हैं, जो यह कहते हुए कि जो पहले है वह डॉलर का चिह्न नहीं है।

(?<!\$)(?:\$(?:\${2,})?)(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))

रेगेक्स डेमो

2
The fourth bird 27 अक्टूबर 2020, 15:23

आप मैचों का दूसरा सेट कुछ इस तरह से प्राप्त कर सकते हैं:

reg2 = '\$(?:{)([_a-zA-Z0-9]+)(?:})'

जो ताल्लुक को अनिवार्य बनाता है लेकिन कब्जा नहीं...

-1
Mike Guelfi 27 अक्टूबर 2020, 02:28