python - पायथन में एक स्ट्रिंग से गैर प्रिंट करने योग्य पात्रों को पट्टी करना



string non-printable (6)

'व्हाइटस्पेस' को हटाने के लिए,

import re
t = """
\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>
"""
pat = re.compile(r'[\t\n]')
print(pat.sub("", t))

https://code.i-harness.com

मैं दौड़ने के लिए उपयोग करते हैं

$s =~ s/[^[:print:]]//g;

गैर प्रिंट करने योग्य पात्रों से छुटकारा पाने के लिए पर्ल पर।

पायथन में कोई पॉज़िक्स रेगेक्स वर्ग नहीं है, और मैं नहीं लिख सकता [: प्रिंट:] इसका अर्थ यह है कि मैं क्या चाहता हूं। मुझे पाइथन में यह पता लगाने के लिए कोई रास्ता नहीं है कि कोई चरित्र प्रिंट करने योग्य है या नहीं।

तुम क्या करोगे?

संपादित करें: इसे यूनिकोड वर्णों का भी समर्थन करना है। स्ट्रिंग। प्रिंट करने योग्य तरीका खुशी से उन्हें आउटपुट से बाहर कर देगा। curses.ascii.isprint किसी भी यूनिकोड चरित्र के लिए झूठी वापसी करेगा।


आप unicodedata.category() फ़ंक्शन का उपयोग कर फ़िल्टर सेट अप करने का प्रयास कर सकते हैं:

printable = Set('Lu', 'Ll', ...)
def filter_non_printable(str):
  return ''.join(c for c in str if unicodedata.category(c) in printable)

उपलब्ध श्रेणियों के लिए यूनिकोड डेटाबेस वर्ण गुण देखें


नीचे दिया गया उपरोक्त दूसरों की तुलना में तेज़ प्रदर्शन करता है। जरा देखो तो

''.join([x if x in string.printable else '' for x in Str])

पायथन 3 में,

def filter_nonprintable(text):
    import string
    # Get the difference of all ASCII characters from the set of printable characters
    nonprintable = set([chr(i) for i in range(128)]).difference(string.printable)
    # Use translate to remove all non-printable characters
    return text.translate({ord(character):None for character in nonprintable})

कैसे .translate () regex और .replace () की तुलना में विराम चिह्न को हटाने पर इस पोस्ट को देखें


सबसे अच्छा मैं अब के साथ आया है (उपरोक्त पायथन-आयोजकों के लिए धन्यवाद)

def filter_non_printable(str):
  return ''.join([c for c in str if ord(c) > 31 or ord(c) == 9])

यह एकमात्र तरीका है जिसे मैंने पाया है जो यूनिकोड वर्ण / तारों के साथ काम करता है

कोई बेहतर विकल्प?


स्ट्रिंग्स पर इटरेटिंग दुर्भाग्य से पाइथन में धीमी है। इस तरह की चीज के लिए नियमित अभिव्यक्ति तीव्रता के क्रम में हैं। आपको सिर्फ चरित्र वर्ग बनाना है। Unicodedata मॉड्यूल इसके लिए काफी उपयोगी है, खासकर unicodedata.category () फ़ंक्शन। श्रेणियों के विवरण के लिए यूनिकोड कैरेक्टर डेटाबेस देखें।

import unicodedata, re

all_chars = (unichr(i) for i in xrange(0x110000))
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc')
# or equivalently and much more efficiently
control_chars = ''.join(map(unichr, range(0,32) + range(127,160)))

control_char_re = re.compile('[%s]' % re.escape(control_chars))

def remove_control_chars(s):
    return control_char_re.sub('', s)




non-printable