2012-06-22 11 views
32

मैं स्ट्रिंगक्या पाइथन में एक मल्टीलाइन स्ट्रिंग को अनइंडेंट करने के लिए अंतर्निहित फ़ंक्शन है?

s = """ 
    Controller = require 'controller' 

    class foo 
     view: 'baz' 
     class: 'bar' 

     constructor: -> 
      Controller.mix @ 
""" 

स्ट्रिंग में हर लाइन अब एक वैश्विक 4 अंतरिक्ष खरोज है है कहो। यदि इस स्ट्रिंग को फ़ंक्शन के अंदर घोषित किया गया था, तो इसमें 8 स्पेस ग्लोबल इंडेंटेशन होगा, आदि

क्या पाइथन स्ट्रिंग के वैश्विक बाएं इंडेंटेशन को हटाने के लिए एक फ़ंक्शन है?

मुझे लगता है कि समारोह उत्पादन चाहते हैं होने के लिए:

Controller = require 'controller' 

class foo 
    view: 'baz' 
    class: 'bar' 

    constructor: -> 
     Controller.mix @" 

उत्तर

61

नहीं निर्मित एक समारोह है, लेकिन मानक पुस्तकालय में एक समारोह: textwrap.dedent()

>>> print(textwrap.dedent(s)) 

Controller = require 'controller' 

class foo 
    view: 'baz' 
    class: 'bar' 

    constructor: -> 
     Controller.mix @ 
+0

मुझे नहीं पता था कि कोई अस्तित्व में है। उपयोगी सामान +1। –

+0

यह ऊपर दिए गए वोटों का सबसे तेज़ संचय है जिसे मैंने कभी जवाब के लिए देखा है – Hubro

+1

यहां समर्पण का स्रोत कोड: http://hg.python.org/cpython/file/2.7/Lib/textwrap.py – Jiri

5

textwrap.dedent() आप क्या चाहते हैं के करीब है , लेकिन यह आपके द्वारा मांगी गई चीज़ों को लागू नहीं करता है, क्योंकि इसकी एक अग्रणी नई लाइन है।

def my_dedent(string): 
    if string and string[0] == '\n': 
     string = string[1:] 
    return textwrap.dedent(string) 

हालांकि textwrap.dedent() विशेष तरीके से सिर्फ खाली स्थान के यह ठीक है अगर आप एक मांगपत्र बहु ​​बयान से अजगर स्रोत पैदा कर रहे हैं, जहां पूर्ण विराम वाले लाइनों संभालती है: आप एक समारोह है कि s से प्रमुख न्यू लाइन स्ट्रिप्स में dedent लपेट कर सकते हैं या तो व्हाइटस्पेस महत्वहीन है।

लेकिन सामान्य रूप में यह अनुचित है कि textwrap.dedent(), 'अधिकतम मांगपत्र' से अधिक सफेद स्थान के साथ लाइनों से अतिरिक्त व्हाइट को हटा सभी खाली स्थान के लाइनों से खाली स्थान के दूर करता है और यह बंद करने """ से पहले किसी भी खाली स्थान के descards कि, खासकर जब से इस व्यवहार undocumented and done with non-transparent regular expressions है ।

चूंकि मैं गैर-पायथन स्रोत कोड भी उत्पन्न करता हूं जहां रिक्त स्थान अक्सर महत्वपूर्ण होते हैं, मैं निम्नलिखित दिनचर्या का उपयोग करता हूं। यह टैब इंडेंटेशन को संभाल नहीं करता है, लेकिन यह आपको आउटपुट देता है जो आपने बिना किसी नई न्यूलाइन के पूछा है, जहां textwrap.dedent() विफल रहता है।

def remove_leading_spaces(s, strict=False): 
    '''Remove the maximum common spaces from all non-empty lines in string 

Typically used to remove leading spaces from all non-empty lines in a 
multiline string, preserving all extra spaces. 
A leading newline (when not useing '"""\') is removed unless the strict 
argument is True. 

Note that if you want two spaces on the last line of the return value 
without a newline, you have to use the max indentation + 2 spaces before 
the closing """. If you just input 2 spaces that is likely to be the 
maximum indent. 
    ''' 
    if s and not strict and s[0] == '\n': 
     s = s[1:] 
    lines = s.splitlines(True) # keep ends 
    max_spaces = -1 
    for line in lines: 
     if line != '\n': 
      for idx, c in enumerate(line[:max_spaces]): 
       if not c == ' ': 
        break 
      max_spaces = idx + 1 
    return ''.join([l if l == '\n' else l[max_spaces-1:] for l in lines]) 
+0

ओपी ने नहीं पूछा अग्रणी न्यूलाइन और न ही इसे हटाने। अग्रणी न्यूलाइन के लिए सबसे आसान इलाज केवल ट्रिपल कोट के बाद बैकस्लैश है। (जैसा कि पहले से ही @firegurafiku द्वारा इंगित किया गया है)। कस्टम फ़ंक्शन के साथ आपूर्ति किए गए textwrap.dedent() को प्रतिस्थापित करने के कारण हो सकते हैं, लेकिन न्यूलाइन को हटाने, जिसे बैकस्लैश से बचा जा सकता है, एक अच्छा प्रतीत नहीं होता है। – gwideman

+0

** प्रोग्रामेटिक ** प्रारंभिक न्यूलाइन को हटाने के लिए अनुरोध किए गए आउटपुट में इनपुट प्रदान किए गए ओपी से प्राप्त करना आवश्यक है। इसे संभालने के विभिन्न तरीकों, जैसे स्पष्ट बैकस्लाश के साथ एक पंक्ति पर स्ट्रिंग को फिर से लिखना। लेकिन ओपी ने अपने इनपुट को संशोधित करने के लिए नहीं पूछा था जैसा कि आप सुझाव देते हैं। – Anthon

+0

ऐसा लगता है कि ओपी का कार्य सामान्य रूप से तारों को संसाधित नहीं करना है, यह एक स्रोत के साथ एक मल्टीलाइन स्ट्रिंग अक्षर लिखने का तरीका है, जिसके आस-पास स्रोत स्रोत इंडेंटेशन से मेल खाने के लिए इंडेंट किया गया है, फिर भी परिणामी स्ट्रिंग में इंडेंटेशन नहीं है।ओपी का विशिष्ट सवाल था "क्या पायथन के स्ट्रिंग के वैश्विक बाएं इंडेंटेशन को हटाने के लिए कोई फ़ंक्शन है?"। अग्रणी न्यूलाइन समस्या प्रासंगिक है, लेकिन अनुरोधित फ़ंक्शन द्वारा हटाए जाने की आवश्यकता नहीं है। उस ने कहा, कुछ स्थितियों में अतिरिक्त सफेद जगह को हटाने के समर्पण पर आपके नोट थोड़ा खतरनाक हैं, और इसके बारे में अधिक जानना दिलचस्प होगा। – gwideman

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

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