2012-06-22 17 views
32

Ben dizePython'un bir çok satırlı dizgiyi serbest bırakmak için yerleşik bir işlevi var mı?

s = """ 
    Controller = require 'controller' 

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

     constructor: -> 
      Controller.mix @ 
""" 

dizede her çizgi artık küresel bir 4 uzay girinti vardır varsayalım. Bu dize bir işlev içinde ilan edildi, bu bir 8 uzay küresel girinti olurdu vb

mu Python dize küresel sol girinti kaldırmak için bir işlevi var?

Olmak o fonksiyon çıkışını istiyorum:

Controller = require 'controller' 

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

    constructor: -> 
     Controller.mix @" 

cevap

61

değil yerleşik bir işlevi, ancak standart kütüphanesinde bir işlevi: textwrap.dedent()

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

Controller = require 'controller' 

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

    constructor: -> 
     Controller.mix @ 
+0

Bir varolduğunu bilmiyordum. Faydalı şeyler. +1. http://hg.python.org/cpython/file/2.7/Lib/textwrap.py 'arasında –

+0

textwrap.dedent (s) 'bir satırsonu ile başlar ve OP tarafından istenmez. – Hubro

+1

Kaynak kodu için gördüğüm en hızlı birikimi var – Jiri

5

textwrap.dedent() istediğini yakındır ama sizin için ne istediğinizi uygulamıyor çünkü lider bir yeni hattı var.

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

Ancak textwrap.dedent() sondaki nerede bir girinti satırlı açıklamada, Python kaynağını ürettiğini eğer Tamam özel bir şekilde sadece boşluk ile çizgiler kolları: Sen s giden yeni satırı soyarak bir işlevde dedent sarmak ya beyaz boşluk önemsizdir.

Ama genel olarak textwrap.dedent() bu davranış undocumented and done with non-transparent regular expressions olduğunu, özellikle de, 'maksimum paragrafta' den fazla boşluk ile hatlarından Fazla boşlukları kaldırır tüm boşluk hatlarından boşluk kaldırır ve kapanış """ önce herhangi boşluk descards o uygunsuz .

Ayrıca boşluk aşağıdaki rutin kullanımı genellikle önemli olan olmayan Python kaynak kodu üretmek yana. Bu, TAB girintisini işlemez, ancak size, textwrap.dedent()'un başarısız olduğu yeni satır olmadan, sorduğunuz çıktıyı verir.

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

OP onaylı OP, gerçek bir sorun değil bu Önde gelen yeni satır veya aynı satırın kaldırılması Yeni satır için en kolay çözüm, yalnızca üçlü alıntıdan sonra ters eğik çizgidir. (@firegurafiku tarafından işaret edildiği gibi) Verilen textwrap.dedent() işlevini özel bir işlevle değiştirmenin bazı nedenleri olabilir, ancak Yeni satırın kaldırılması, sadece ters eğik çizgi ile önlenebilir, iyi görünmez. – gwideman

+0

İlk satırın ** programatik ** kaldırılması, sağlanan OP'lerin sağladığı girişten çıkmak için gereklidir. Bunu yapmak için farklı yollar, örneğin dizeyi bir satırda açık ters eğik çizgi ile yeniden yazmak gibi. Ancak OP, önerisini düşündüğünüz gibi nasıl değiştireceğini sormadı. – Anthon

+0

OP'nin görevinin genel olarak dizeleri işlemek değil, kaynak kodlu bir giriş dizisini, çevreleyen kaynak girintisiyle eşleşecek şekilde yazması ve sonuçta ortaya çıkan dizenin bu girintiyi içermemesidir.OP'nin özel sorusu "Python'un dizginin küresel sol girintisini kaldırmak için bir işlevi var mı?" Idi. Önde gelen yeni satır sayısı alakalı, ancak istenen işlev tarafından silinmesi gerekmiyor. Dedi ki, bazı durumlarda ekstra boşlukları ortadan kaldırmaktan alıkoyan notlarınız biraz endişe verici ve daha fazla bilgi sahibi olmak ilginç olurdu. – gwideman

İlgili konular