मैं अजगर स्ट्रिंग में शाब्दिक घुंघराले-ब्रेस पात्रों को कैसे प्रिंट कर सकता हूं और उस पर भी उपयोग कर सकता हूं।


1507
x = " \{ Hello \} {0} "
print(x.format(42))

मुझे देता है : Key Error: Hello\\

मैं आउटपुट प्रिंट करना चाहता हूं: {Hello} 42


1
इन्हें भी देखें: stackoverflow.com/questions/35574349
dreftymac

9
उन लोगों के लिए जो दोहरी ब्रेसिज़ ( {{ }}) से बचना चाहते हैं , का उपयोग करें string.Template। वहां आप फॉर्म के पहचानकर्ताओं $foo(LaTeX कोड को जनरेट करने के लिए काम) का विकल्प देते हैं।
Ioannis Filippidis

उन लोगों के लिए जो दोहरी ब्रेसिज़ से बचना चाहते हैं, और जो अपने पायथन प्रोजेक्ट्स में एक और निर्भरता को जोड़ने के लिए प्रतिकूल नहीं हैं, वहाँ भी है Jinja2 जो निश्चित रूप से इस समस्या को हल करता है, उपयोगकर्ता द्वारा परिभाषित कस्टम प्लेसहोल्डर सीमांकक सिंटैक्स की अनुमति देकर।
dreftymac

जवाबों:


2066

आपको डबल {{और }}:

>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '

यहाँ प्रारूप स्ट्रिंग सिंटैक्स के लिए पायथन प्रलेखन का प्रासंगिक हिस्सा है :

प्रारूप के तार घुंघराले ब्रेसिज़ से घिरे "प्रतिस्थापन फ़ील्ड" होते हैं {}। कुछ भी जो ब्रेसिज़ में निहित नहीं है, उन्हें शाब्दिक पाठ माना जाता है, जिसे आउटपुट में अपरिवर्तित कॉपी किया जाता है। यदि आपको शाब्दिक पाठ में ब्रेस चरित्र को शामिल करने की आवश्यकता है, तो इसे दोहरीकरण से बचाया जा सकता है: {{और }}


264
इसलिए यदि आप "{42}" प्रिंट करना चाहते हैं, तो आप उपयोग करेंगे "{{{0}}}".format(42)!
ह्यूजेस

7
क्या होगा अगर आप एक एकल घुंघराले ब्रेस चाहते हैं? "{ something { } {value}".format(42)काम नहीं करता है।
एजेपी

14
"{{" .format () और "}}"। स्वरूप () प्रिंट एकल घुंघराले ब्रेसिज़। अपने उदाहरण में: "{{कुछ {{}} {0}" मुद्रित करें। प्रारूप (42) "{कुछ {} 42" मुद्रित करेगा।
मार्क विज़सर

2
क्या {0}मतलब है?
कोडिब्यूस्टीन

6
@ आईरे: {0}पहले तर्क को संदर्भित करता है .format(){0} {1} {2}जब तक आप समान तर्क देते हैं, तब तक आप एक से अधिक मूल्य प्रिंट कर सकते हैं .format()। व्यापक उदाहरण के लिए docs.python.org/library/string.html#format-examples देखें ।
ग्रेग हेविगिल


60

अजगर 3.6+ (2017)

पायथन के हाल के संस्करणों में एक f- स्ट्रिंग्स ( PEP498 भी देखें ) का उपयोग करेगा ।

एफ-स्ट्रिंग्स के साथ एक को डबल {{या का उपयोग करना चाहिए}}

n = 42  
print(f" {{Hello}} {n} ")

वांछित पैदा करता है

 {Hello} 42

यदि आपको शाब्दिक पाठ का उपयोग करने के बजाय कोष्ठक में एक अभिव्यक्ति को हल करने की आवश्यकता है, तो आपको कोष्ठक के तीन सेटों की आवश्यकता होगी:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

पैदा करता है

{hello}

46

ओपी ने यह टिप्पणी लिखी है:

मैं कुछ उद्देश्यों के लिए एक छोटा JSON प्रारूपित करने की कोशिश कर रहा था, जैसे: '{"all": false, "selected": "{}"}'.format(data)कुछ पाने के लिए{"all": false, "selected": "1,2"}

यह बहुत आम है कि "भागने वाले ब्रेसिज़" मुद्दा जेन्सन के साथ काम करते समय सामने आता है।

मैं यह करने का सुझाव देता हूं:

import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)

यह वैकल्पिक की तुलना में क्लीनर है, जो है:

'{{"all": false, "selected": "{}"}}'.format(data)

jsonलाइब्रेरी का उपयोग करना निश्चित रूप से बेहतर होता है जब JSON स्ट्रिंग उदाहरण से अधिक जटिल हो जाती है।


1
तथास्तु! यह अधिक काम की तरह लग सकता है, लेकिन पुस्तकालयों का उपयोग करने के लिए पुस्तकालयों को क्या करना चाहिए बनाम काटने वाले कोनों ... बेहतर चीजों के लिए बनाता है।
काओलिन फायर

1
लेकिन पायथन ऑब्जेक्ट में कुंजियों के क्रम की गारंटी नहीं है ... फिर भी, JSON लाइब्रेरी को JSON तरीके से क्रमबद्ध करने की गारंटी है।
wizzwizz4

2
wizzwizz4: अच्छी बात है। पाइथन 3.6 के बाद से, डिक्शनरी का आदेश दिया जाता है, इसलिए यह एक मुद्दा नहीं होगा। 2.7 और 3.5 के बीच पायथन के संस्करण संग्रह पुस्तकालय से ऑर्डरडीड का उपयोग कर सकते हैं।
ट्वासब्रिलिग

24

ऐसा करने का प्रयास करें:

x = " {{ Hello }} {0} "
print x.format(42)


14

हालांकि कोई बेहतर नहीं, सिर्फ संदर्भ के लिए, आप यह भी कर सकते हैं:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

यह उदाहरण के लिए उपयोगी हो सकता है जब कोई प्रिंट करना चाहता है {argument}। यह शायद अधिक पठनीय है'{{{}}}'.format('argument')

ध्यान दें कि आप पायथन 2.7 के बाद तर्क पदों (जैसे कि {}बजाय {0}) को छोड़ देते हैं


5

यदि आप ऐसा करने जा रहे हैं, तो एक उपयोगिता फ़ंक्शन को परिभाषित करना अच्छा हो सकता है, जो आपको मनमाने ढंग से ब्रेस प्रतिस्थापन का उपयोग करने देगा, जैसे

def custom_format(string, brackets, *args, **kwargs):
    if len(brackets) != 2:
        raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
    padded = string.replace('{', '{{').replace('}', '}}')
    substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
    formatted = substituted.format(*args, **kwargs)
    return formatted

>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'

ध्यान दें कि यह या तो कोष्ठक 2 लंबाई की स्ट्रिंग के साथ या दो तार (बहु-वर्ण नाजुकता के लिए) के चलने योग्य होगा।


उस बारे में भी सोचा। बेशक, यह भी काम करेगा और एल्गोरिथ्म सरल है। लेकिन, कल्पना कीजिए कि आपके पास इस तरह के बहुत सारे पाठ हैं, और आप बस इसे यहां और वहां पैरामीटर बनाना चाहते हैं। हर बार जब आप एक इनपुट स्ट्रिंग बनाते हैं तो आप उन सभी ब्रेसिज़ को मैन्युअल रूप से बदलना नहीं चाहेंगे। आप बस यहाँ और वहाँ अपने मापदंडों में 'ड्रॉप' करना चाहते हैं। इस मामले में, मुझे लगता है कि उपयोगकर्ता के दृष्टिकोण से इस पद्धति के बारे में सोचना और पूरा करना दोनों आसान है। मैं लिनेक्स के 'सेड' कमांड से प्रेरित था जिसमें समान रूप से जो सुविधाजनक है उसके आधार पर आपके परिसीमन को चुनने की समान क्षमता है।
tvt173 18

संक्षेप में, मुझे लगता है कि उपयोगिता समारोह थोड़ा और अधिक जटिल होगा, क्योंकि यह $ $ में हर बार उपयोग करने के लिए एक दर्द हो सकता है। कृपया मुझे बताएं कि क्या मैंने आपके प्रस्ताव को गलत समझा।
tvt173

मैंने आगे बढ़ और मेरे public.lab अंतरिक्ष के लिए एक छोटा डेमो जोड़ दिया है github.com/dreftymac/public.lab/blob/master/topic/python/...
dreftymac

3

मैं हाल ही में इसमें भाग गया, क्योंकि मैं पहले से तैयार JSON में तारों को इंजेक्ट करना चाहता था। मेरा समाधान इस तरह से एक सहायक विधि बनाने का था:

def preformat(msg):
    """ allow {{key}} to be used for formatting in text
    that already uses curly braces.  First switch this into
    something else, replace curlies with double curlies, and then
    switch back to regular braces
    """
    msg = msg.replace('{{', '<<<').replace('}}', '>>>')
    msg = msg.replace('{', '{{').replace('}', '}}')
    msg = msg.replace('<<<', '{').replace('>>>', '}')
    return msg

फिर आप कुछ ऐसा कर सकते हैं:

formatted = preformat("""
    {
        "foo": "{{bar}}"
    }""").format(bar="gas")

यदि प्रदर्शन कोई मुद्दा नहीं है तो काम पूरा हो जाता है।


साधारण और सुरुचिपूर्ण आवश्यक संशोधन के साथ मौजूदा कोड में एकीकृत करने के लिए। धन्यवाद!
कॉलम 01

2

यदि आपको स्ट्रिंग में दो घुंघराले ब्रेस रखने की आवश्यकता है, तो आपको चर के प्रत्येक तरफ 5 घुंघराले ब्रेस की आवश्यकता होगी।

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

F-

0

कारण है, {}क्या .format()आपके मामले में वाक्य रचना है, इसलिए यह .format()पहचान नहीं करता है कि {Hello}यह एक त्रुटि है।

आप इसे डबल घुंघराले ब्रेसिज़ {{}} का उपयोग करके ओवरराइड कर सकते हैं,

x = " {{ Hello }} {0} "

या

%sपाठ स्वरूपण के लिए प्रयास करें,

x = " { Hello } %s"
print x%(42)  

0

मैं पाठ को प्रिंट करने की कोशिश करते समय इस समस्या पर ठोकर खाई, जिसे मैं लेटेक्स दस्तावेज़ में पेस्ट कॉपी कर सकता हूं। मैं इस उत्तर का विस्तार करता हूं और नामित प्रतिस्थापन क्षेत्रों का उपयोग करता हूं :

कहते हैं कि आप इंडिविजुअल जैसे mulitple वेरिएबल्स के एक उत्पाद का प्रिंट आउट लेना चाहते हैं यहां छवि विवरण दर्ज करें, जैसे कि लेटेक्स में होगा $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ । निम्नलिखित कोड नामित फ़ील्ड्स के साथ काम करता है ताकि कई सूचकांकों के लिए यह पठनीय रहे:

idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))

-1

यदि आप केवल एक घुंघराले ब्रेस (उदाहरण के लिए {) का उपयोग करना चाहते हैं {{, और यदि आप चाहें तो बाद में स्ट्रिंग में अधिक ब्रेसिज़ जोड़ सकते हैं। उदाहरण के लिए:

>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'

-1

जब आप कोड स्ट्रिंग्स को प्रक्षेपित करने की कोशिश कर रहे हैं, तो मैं सुझाव दूंगा कि jinja2 का उपयोग करें, जो कि पायथन के लिए एक पूर्ण विशेषताओं वाला टेम्पलेट इंजन है:

from jinja2 import Template

foo = Template('''
#include <stdio.h>

void main() {
    printf("hello universe number {{number}}");
}
''')

for i in range(2):
    print(foo.render(number=i))

तो आप घुंघराले ब्रेसिज़ को डुप्लिकेट करने के लिए लागू नहीं होंगे क्योंकि अन्य उत्तरों के पूरे गुच्छा का सुझाव है


-3

आप स्ट्रिंग से पहले बिना उद्धरण के केवल 'r' अक्षर जोड़कर कच्ची स्ट्रिंग विधि का उपयोग करके ऐसा कर सकते हैं।

# to print '{I am inside braces}'
print(r'{I am inside braces}')

नमस्कार! आप पुन: जांच कर सकते हैं कि; पायथन 3.7 प्रिंट \{I am inside braces\}
तेदुंआर

1
@Teodor को इसके लिए खेद है। अब मैंने इसे कच्चे स्ट्रिंग के रूप में प्रिंट करके तय किया।
हर्ष अग्रवाल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.