(1) यह आपका कोड है, आपके नियंत्रण में। आप अपने डेटा में एस्केप अनुक्रम जोड़ना चाहते हैं और फिर उन्हें फिर से बाहर करना चाहते हैं ताकि आप अपने डेटा की लंबाई की गणना कर सकें ?? से पहले भागने के दृश्य जोड़कर पैडिंग की गणना करने के लिए यह बहुत आसान लगता है। मैं क्या खो रहा हूँ?
मान लीजिए कि किसी भी बचने के दृश्य कर्सर की स्थिति को बदलते हैं। यदि वे करते हैं, तो वर्तमान में स्वीकृत उत्तर वैसे भी काम नहीं करेगा।
मान लीजिए कि आपके पास string_data
नाम की एक सूची में प्रत्येक कॉलम (भागने अनुक्रम जोड़ने से पहले) के लिए स्ट्रिंग डेटा है और पूर्व निर्धारित कॉलम चौड़ाई width
नाम की एक सूची में हैं। कुछ इस तरह का प्रयास करें: ओपी की टिप्पणी के बाद
temp = []
for colx, text in enumerate(string_data):
npad = width[colx] - len(text) # calculate padding size
assert npad >= 0
enhanced = fancy_text(text, colx, etc, whatever) # add escape sequences
temp.append(enhanced + " " * npad)
sys.stdout.write("".join(temp))
अद्यतन "" "कारण मैं उन्हें निकाल देते हैं और लंबाई के बाद स्ट्रिंग रंग कोड होता है गणना करना चाहते हैं, क्योंकि सभी डेटा प्रोग्राम के रूप में बनाया गया है है। मेरे पास रंगीन विधियों का एक गुच्छा है और मैं इस तरह कुछ डेटा बना रहा हूं: str = "% s /% s /% s"% (ग्रीन (डेटा 1), नीला (डेटा 2), लाल (डेटा 3)) यह होगा तथ्य के बाद पाठ को रंगना बहुत मुश्किल हो। ""
यदि डेटा अपने स्वयं के स्वरूपण के साथ प्रत्येक टुकड़े से बना है, तो आप अभी भी प्रदर्शित लंबाई और पैड की गणना कर सकते हैं।
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(40, 48)
BOLD = 1
def render_and_pad(reqd_width, components, sep="/"):
temp = []
actual_width = 0
for fmt_code, text in components:
actual_width += len(text)
strg = "\x1b[%dm%s\x1b[m" % (fmt_code, text)
temp.append(strg)
if temp:
actual_width += len(temp) - 1
npad = reqd_width - actual_width
assert npad >= 0
return sep.join(temp) + " " * npad
print repr(
render_and_pad(20, zip([BOLD, GREEN, YELLOW], ["foo", "bar", "zot"]))
)
यदि आपको लगता है कि कॉल विराम चिह्न द्वारा बोझ है, तो आप की तरह कुछ कर सकता है::
BOLD = lambda s: (1, s)
BLACK = lambda s: (40, s)
# etc
def render_and_pad(reqd_width, sep, *components):
# etc
x = render_and_pad(20, '/', BOLD(data1), GREEN(data2), YELLOW(data3))
(2) मुझे समझ नहीं आता यहाँ एक समारोह जो करता है एक सेल की सामग्री के लिए कि आप आपूर्ति-के-पायथन नियमित अभिव्यक्ति किट का उपयोग क्यों नहीं करना चाहते हैं। नहीं "hackery" ("hackery" है कि मैं के बारे में पता कर रहा हूँ के किसी भी संभावित अर्थ के लिए) शामिल है:
>>> import re
>>> test = "1\x1b[a2\x1b[42b3\x1b[98;99c4\x1b[77;66;55d5"
>>> expected = "12345"
>>> # regex = re.compile(r"\x1b\[[;\d]*[A-Za-z]")
... regex = re.compile(r"""
... \x1b # literal ESC
... \[ # literal [
... [;\d]* # zero or more digits or semicolons
... [A-Za-z] # a letter
... """, re.VERBOSE)
>>> print regex.findall(test)
['\x1b[a', '\x1b[42b', '\x1b[98;99c', '\x1b[77;66;55d']
>>> actual = regex.sub("", test)
>>> print repr(actual)
'12345'
>>> assert actual == expected
>>>
अद्यतन ओपी की टिप्पणी "" "मैं अभी भी पॉल के जवाब पसंद करते हैं, क्योंकि यह अधिक संक्षिप्त है" "के बाद "
अधिक संक्षिप्त क्या है? रेगेक्स समाधान आपके लिए पर्याप्त नहीं है:
# === setup ===
import re
strip_ANSI_escape_sequences_sub = re.compile(r"""
\x1b # literal ESC
\[ # literal [
[;\d]* # zero or more digits or semicolons
[A-Za-z] # a letter
""", re.VERBOSE).sub
def strip_ANSI_escape_sequences(s):
return strip_ANSI_escape_sequences_sub("", s)
# === usage ===
raw_data = strip_ANSI_escape_sequences(formatted_data)
??
ये वास्तव में "एएनएसआईआई" रंग कोड हैं, न कि "ASCII", जैसा कि एएनएसआई रंग टर्मिनल पर दिखाया जाएगा, या ANSI.SYS ड्राइवर का उपयोग कर पीसी पर। – PaulMcG