मैं व्हाट्सएप ट्रिम कैसे करूं?


1071

क्या एक पायथन फ़ंक्शन है जो एक स्ट्रिंग से व्हाट्सएप (रिक्त स्थान और टैब) को ट्रिम करेगा?

उदाहरण: \t example string\texample string


1
सर उठाने के लिए धन्यवाद। मैंने पहले स्ट्रिप फंक्शन की खोज की थी, लेकिन यह मेरे इनपुट के लिए काम नहीं करता है ..
क्रिस

1
के रूप में भी: stackoverflow.com/questions/761804/trimming-a-string-in-python (भले ही यह प्रश्न थोड़ा स्पष्ट हो, IMHO)। यह भी लगभग वैसा ही है: stackoverflow.com/questions/959215/…
जोनीक

6
वर्णों का मानना ​​है कि व्हॉट्सएप में संग्रहीत हैं string.whitespace
जॉन फोहे

2
"स्ट्रिप फंक्शन" से क्या आपका मतलब स्ट्रिप विधि से है? "यह मेरे इनपुट के लिए काम नहीं करता है" कृपया अपना कोड, अपना इनपुट और आउटपुट प्रदान करें।
एस.लॉट जूल 27'09

जवाबों:


1599

दोनों तरफ व्हॉट्सएप:

s = "  \t a string example\t  "
s = s.strip()

दाईं ओर व्हॉट्सएप:

s = s.rstrip()

बाईं ओर व्हॉट्सएप:

s = s.lstrip()

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

s = s.strip(' \t\n\r')

यह किसी भी अंतरिक्ष पट्टी होगा, \t, \n, या \rबाएं ओर से पात्रों, दाएँ हाथ की ओर, या स्ट्रिंग के दोनों ओर।

ऊपर दिए गए उदाहरण केवल बाएं-हाथ और दाएं-बाएं से तार के तारों को हटाते हैं। यदि आप किसी स्ट्रिंग के बीच से वर्ण हटाना चाहते हैं, तो प्रयास करें re.sub:

import re
print re.sub('[\s+]', '', s)

यह पता लगाना चाहिए:

astringexample

18
पट्टी () एक बहस में लेता है यह बताने के लिए कि क्या यात्रा करना है। कोशिश करें: पट्टी ('\ t \ n \ r')
thedz

3
उदाहरण के लिए परिणाम काफी उपयोगी होना चाहिए :)
टन


3
अंतिम उदाहरण उपयोग करने के समान है str.replace(" ","")। आपको reतब तक उपयोग करने की आवश्यकता नहीं है , जब तक आपके पास एक से अधिक स्थान नहीं हैं, तब आपका उदाहरण काम नहीं करता है। []एकल वर्णों को चिह्नित करने के लिए डिज़ाइन किया गया है, यदि आप सिर्फ उपयोग कर रहे हैं तो यह अनावश्यक है \s। का प्रयोग करें या तो \s+या [\s]+(अनावश्यक), लेकिन [\s+]काम नहीं करता है, विशेष रूप से यदि आप मोड़ की तरह एक भी एक साथ एक से अधिक रिक्त स्थान बदलना चाहते हैं "this example" में "this example"
जॉर्ज ई। कार्डोना

3
@ JorgeE.Cardona - एक चीज़ जो आप के बारे में थोड़ी गलत है - \sजिसमें टैब शामिल replace(" ", "")नहीं होंगे।
आर्टऑफवर्फ

72

पायथन trimविधि को कहा जाता है strip:

str.strip() #trim
str.lstrip() #ltrim
str.rstrip() #rtrim

5
जो याद रखना आसान है क्योंकि s tri p लगभग tri m जैसा दिखता है ।
इस्सर

22

अग्रणी और अनुगामी व्हाट्सएप के लिए:

s = '   foo    \t   '
print s.strip() # prints "foo"

अन्यथा, एक नियमित अभिव्यक्ति काम करती है:

import re
pat = re.compile(r'\s+')
s = '  \t  foo   \t   bar \t  '
print pat.sub('', s) # prints "foobar"

1
आपने अपना रेगेक्स संकलित नहीं किया। आपको इसे बनाने की आवश्यकता हैpat = re.compile(r'\s+')
इवान फॉसममार्क

आप आम तौर पर बाद में शब्दों का विलय sub(" ", s)नहीं करना चाहते हैं ""और आप अब .split(" ")टोकन का उपयोग करने में सक्षम नहीं होंगे ।
user3467349

printबयानों के उत्पादन को देखना अच्छा होगा
रॉन क्लेन

19

आप बहुत ही सरल और मूल फ़ंक्शन का उपयोग कर सकते हैं: str.replace () , व्हाट्सएप और टैब के साथ काम करता है:

>>> whitespaces = "   abcd ef gh ijkl       "
>>> tabs = "        abcde       fgh        ijkl"

>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl

सरल और आसान।


2
लेकिन यह, अफसोस, आंतरिक स्थान को भी हटा देता है, जबकि मूल प्रश्न में उदाहरण आंतरिक रिक्त स्थान को छोड़ देता है।
ब्रैंडन रोड्स

12
#how to trim a multi line string or a file

s=""" line one
\tline two\t
line three """

#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.

s1=s.splitlines()
print s1
[' line one', '\tline two\t', 'line three ']

print [i.strip() for i in s1]
['line one', 'line two', 'line three']




#more details:

#we could also have used a forloop from the begining:
for line in s.splitlines():
    line=line.strip()
    process(line)

#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:
for line in my_file:
    line=line.strip()
    process(line)

#moot point: note splitlines() removed the newline characters, we can keep them by passing True:
#although split() will then remove them anyway..
s2=s.splitlines(True)
print s2
[' line one\n', '\tline two\t\n', 'line three ']

4

इन रेगेक्स समाधानों को अभी तक किसी ने पोस्ट नहीं किया है।

मेल मिलाना:

>>> import re
>>> p=re.compile('\\s*(.*\\S)?\\s*')

>>> m=p.match('  \t blah ')
>>> m.group(1)
'blah'

>>> m=p.match('  \tbl ah  \t ')
>>> m.group(1)
'bl ah'

>>> m=p.match('  \t  ')
>>> print m.group(1)
None

खोज (आपको "केवल रिक्त स्थान" इनपुट केस को अलग तरीके से संभालना होगा):

>>> p1=re.compile('\\S.*\\S')

>>> m=p1.search('  \tblah  \t ')
>>> m.group()
'blah'

>>> m=p1.search('  \tbl ah  \t ')
>>> m.group()
'bl ah'

>>> m=p1.search('  \t  ')
>>> m.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

यदि आप उपयोग करते हैं re.sub, तो आप आंतरिक व्हाट्सएप को हटा सकते हैं, जो अवांछनीय हो सकता है।


3

व्हॉट्सएप में स्पेस, टैब और CRLF शामिल हैं । तो एक सुरुचिपूर्ण और एक लाइनर स्ट्रिंग फ़ंक्शन जिसका हम उपयोग कर सकते हैं अनुवाद है

' hello apple'.translate(None, ' \n\t\r')

या यदि आप पूरी तरह से होना चाहते हैं

import string
' hello  apple'.translate(None, string.whitespace)

3

(re.sub ('+', '', (my_str.replace ('\ n', ''))))। पट्टी ()

यह सभी अवांछित स्थानों और newline वर्णों को हटा देगा। उममीद है कि इससे मदद मिलेगी

import re
my_str = '   a     b \n c   '
formatted_str = (re.sub(' +', ' ',(my_str.replace('\n',' ')))).strip()

यह परिणाम होगा:

'a b \ nc' को 'ab c' में बदल दिया जाएगा


2
    something = "\t  please_     \t remove_  all_    \n\n\n\nwhitespaces\n\t  "

    something = "".join(something.split())

उत्पादन:

please_remove_all_whitespaces


उत्तर के लिए Le Droid की टिप्पणी जोड़ना। एक स्थान के साथ अलग करने के लिए:

    something = "\t  please     \t remove  all   extra \n\n\n\nwhitespaces\n\t  "
    something = " ".join(something.split())

उत्पादन:

कृपया सभी अतिरिक्त व्हाट्सएप को हटा दें


1
सरल और कुशल। "" .Join का उपयोग कर सकते हैं ... (शब्दों को एक स्थान से अलग रखने के लिए।
Le Droid

1

यदि पायथन 3 का उपयोग कर रहे हैं: अपने प्रिंट स्टेटमेंट में, sep = "" के साथ समाप्त करें। यह सभी रिक्त स्थान को अलग कर देगा।

उदाहरण:

txt="potatoes"
print("I love ",txt,"",sep="")

यह छपेगा: मुझे आलू बहुत पसंद है।

इसके बजाय: मुझे आलू बहुत पसंद है।

आपके मामले में, जब से आप \ t की सवारी प्राप्त करने की कोशिश कर रहे हैं, sep = "\ t" करें


1

समझ के विभिन्न डिग्री के साथ यहाँ काफी कुछ समाधानों को देखने के बाद, मैंने सोचा कि अगर स्ट्रिंग अल्पविराम से अलग हो जाए तो क्या करना चाहिए ...

समस्या

संपर्क जानकारी के एक सीएसवी को संसाधित करने की कोशिश करते समय, मुझे इस समस्या का हल चाहिए था: एक्स्ट्रासियस व्हाट्सएप और कुछ जंक ट्रिम करें, लेकिन ट्रेलिंग कॉमा और आंतरिक व्हाट्सएप को संरक्षित करें। संपर्कों पर नोट्स वाले क्षेत्र के साथ काम करते हुए, मैं अच्छे सामान को छोड़कर, कचरा निकालना चाहता था। सभी विराम चिह्नों और अव्यवस्था को बाहर निकालते हुए, मैं यौगिक टोकन के बीच व्हाट्सएप को खोना नहीं चाहता था क्योंकि मैं बाद में पुनर्निर्माण नहीं करना चाहता था।

रेगेक्स और पैटर्न: [\s_]+?\W+

पैटर्न किसी भी व्हाट्सएप चरित्र के एकल उदाहरणों और अंडरस्कोर ('_') को 1 से असीमित संख्या में आलसी (जितना संभव हो सके कुछ वर्ण) के लिए देखता है, [\s_]+?इससे पहले कि गैर-शब्द वाले अक्षर 1 से असीमित राशि तक होते हैं। इसके साथ समय: \W+(के बराबर है)[^a-zA-Z0-9_] )। विशेष रूप से, यह व्हाट्सएप के swaths को ढूँढता है: null वर्ण (\ 0), tabs (\ t), newlines (\ n), फ़ीड-फ़ॉर्वर्ड (\ f), गाड़ी का रिटर्न (\ r)।

मुझे इसका फायदा दो गुना के रूप में दिखता है:

  1. यह पूर्ण शब्दों / टोकन के बीच व्हाट्सएप को नहीं हटाता है जिसे आप एक साथ रखना चाहते हैं;

  2. पायथन का स्ट्रिंग विधि में बनाया गया स्ट्रिंग strip()के अंदर सौदा नहीं करता है, बस बाएं और दाएं छोर पर है, और डिफ़ॉल्ट arg शून्य वर्ण है (उदाहरण के लिए नीचे देखें: कई newlines पाठ में हैं, और strip()उन सभी को नहीं हटाते हैं जब regex पैटर्न करता है) ।text.strip(' \n\t\r')

यह ओपी प्रश्न से परे है, लेकिन मुझे लगता है कि बहुत सारे मामले हैं जहां हमारे पास पाठ डेटा के भीतर विषम, पैथोलॉजिकल उदाहरण हो सकते हैं, जैसा कि मैंने किया था (कुछ पाठ में भागने के पात्र कैसे समाप्त हुए)। इसके अलावा, सूची-जैसे तारों में, हम सीमांकक को तब तक समाप्त नहीं करना चाहते जब तक कि सीमांकक दो व्हाट्सएप वर्ण या कुछ गैर-शब्द वर्ण, जैसे '-,' या '-,,,', को अलग नहीं करता।

NB: CSV के परिसीमन के बारे में बात नहीं कर रहा है। केवल CSV के भीतर ऐसे उदाहरण हैं जहां डेटा सूची-जैसा है, अर्थात सब्सट्रिंग का एक सीएस स्ट्रिंग है।

पूर्ण प्रकटीकरण: मैं केवल लगभग एक महीने के लिए पाठ में हेरफेर कर रहा हूं, और पिछले दो सप्ताह से केवल regex हूं, इसलिए मुझे यकीन है कि कुछ ऐसी बारीकियां हैं जो मुझे याद आ रही हैं। कहा कि, स्ट्रिंग्स के छोटे संग्रह के लिए (मेरा 12,000 पंक्तियों और 40 विषम स्तंभों के डेटाफ्रेम में है), बाहरी पात्रों को हटाने के लिए एक अंतिम चरण के बाद अंतिम चरण के रूप में, यह असाधारण रूप से अच्छी तरह से काम करता है, खासकर यदि आप कुछ अतिरिक्त व्हाट्सएप का परिचय देते हैं जहां आप एक गैर-शब्द वर्ण द्वारा शामिल किए गए पाठ को अलग करना चाहते हैं, लेकिन व्हॉट्सएप को जोड़ना नहीं चाहते हैं जहां पहले कोई नहीं था।

एक उदाहरण:

import re


text = "\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109                                                 \n\n\n\nklkjsdf\""

print(f"Here is the text as formatted:\n{text}\n")
print()
print("Trimming both the whitespaces and the non-word characters that follow them.")
print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)
print(clean_text)
print()
print("what about 'strip()'?")
print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')  # strip out whitespace?
print()
print(f"Here is the text, formatted as is:\n{clean_text}\n")

print()
print("Are 'text' and 'clean_text' unchanged?")
print(clean_text == text)

यह आउटपुट:

Here is the text as formatted:

"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf" 

using regex to trim both the whitespaces and the non-word characters that follow them.

"portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk,  jim.somedude@blahblah.com, dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"

Very nice.
What about 'strip()'?

Here is the text, formatted as is:

"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf"


Here is the text, after stipping with 'strip':


"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf"
Are 'text' and 'clean_text' unchanged? 'True'

इसलिए पट्टी एक बार में एक व्हाट्सएप को हटा देती है। तो ओपी मामले में, strip()ठीक है। लेकिन अगर चीजें अधिक जटिल हो जाती हैं, तो रेगेक्स और एक समान पैटर्न अधिक सामान्य सेटिंग्स के लिए कुछ मूल्य का हो सकता है।

इसे कार्रवाई में देखें


0

अनुवाद का प्रयास करें

>>> import string
>>> print '\t\r\n  hello \r\n world \t\r\n'

  hello 
 world  
>>> tr = string.maketrans(string.whitespace, ' '*len(string.whitespace))
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr)
'     hello    world    '
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr).replace(' ', '')
'helloworld'

0

यदि आप स्ट्रिंग की शुरुआत और अंत में व्हाट्सएप ट्रिम करना चाहते हैं, तो आप कुछ इस तरह से कर सकते हैं:

some_string = "    Hello,    world!\n    "
new_string = some_string.strip()
# new_string is now "Hello,    world!"

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

लेकिन आप क्यूटी के QString की तरह कुछ :: सरलीकृत () विधि है जो न केवल प्रमुख और रिक्त स्थान को अनुगामी निकाल देता है, लेकिन यह भी "squishes" एक अंतरिक्ष चरित्र के लिए सभी लगातार आंतरिक खाली स्थान के चाहते हैं, तो आप के संयोजन का उपयोग कर सकते हैं .split()और " ".joinइस तरह,:

some_string = "\t    Hello,  \n\t  world!\n    "
new_string = " ".join(some_string.split())
# new_string is now "Hello, world!"

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


-1

आम तौर पर, मैं निम्नलिखित विधि का उपयोग कर रहा हूं:

>>> myStr = "Hi\n Stack Over \r flow!"
>>> charList = [u"\u005Cn",u"\u005Cr",u"\u005Ct"]
>>> import re
>>> for i in charList:
        myStr = re.sub(i, r"", myStr)

>>> myStr
'Hi Stack Over  flow'

नोट: यह केवल "\ n", "\ r" और "\ t" को हटाने के लिए है। यह अतिरिक्त स्थान नहीं हटाता है।


-2

स्ट्रिंग के बीच से व्हाट्सएप हटाने के लिए

$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;

उत्पादन:

ATGCGACACGATCGACC

1
यह प्रश्न अजगर के बारे में है, जावास्क्रिप्ट या पर्ल के बारे में नहीं
phuclv

-17

यह एक स्ट्रिंग की शुरुआत और अंत दोनों से सभी व्हाट्सएप और नईलाइन्स को हटा देगा:

>>> s = "  \n\t  \n   some \n text \n     "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"

8
जब s.strip()वास्तव में ऐसा करता है तो रेगेक्स का उपयोग क्यों करें ?
नेड बाथेल्ड

1
s.strip()केवल अन्य अवांछित वर्णों को हटाने के बाद प्रारंभिक सफेद स्थान को संभालता है, लेकिन व्हाट्सएप को "खोजा" नहीं गया है। ध्यान दें कि यह अंतिम अग्रणी के बाद भी व्हाट्सएप को हटा देगा\n
Rafe

किसी ने इस जवाब को वोट दिया, लेकिन यह नहीं बताया कि यह त्रुटिपूर्ण क्यों है। आप पर शर्म आती है (@NedBatchelder अगर डाउन वोट था तो आप कृपया उल्टा कर दें क्योंकि मैंने आपका सवाल समझाया और आपने मेरे जवाब से वास्तव में कुछ भी नहीं तोड़ा)
Rafe

10
Rafe, आप डबल-चेक करना चाह सकते हैं: s.strip()आपके रेगेक्स के समान ही परिणाम उत्पन्न करता है।
नेड बाचेल्डर

3
@ सुरक्षित, आप इसे ट्रिम के साथ भ्रमित कर रहे हैं। पट्टी आवश्यक संचालन करती है।
iMitwe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.