क्या एक पायथन फ़ंक्शन है जो एक स्ट्रिंग से व्हाट्सएप (रिक्त स्थान और टैब) को ट्रिम करेगा?
उदाहरण: \t example string\t
→example string
string.whitespace
।
क्या एक पायथन फ़ंक्शन है जो एक स्ट्रिंग से व्हाट्सएप (रिक्त स्थान और टैब) को ट्रिम करेगा?
उदाहरण: \t example string\t
→example string
string.whitespace
।
जवाबों:
दोनों तरफ व्हॉट्सएप:
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
str.replace(" ","")
। आपको re
तब तक उपयोग करने की आवश्यकता नहीं है , जब तक आपके पास एक से अधिक स्थान नहीं हैं, तब आपका उदाहरण काम नहीं करता है। []
एकल वर्णों को चिह्नित करने के लिए डिज़ाइन किया गया है, यदि आप सिर्फ उपयोग कर रहे हैं तो यह अनावश्यक है \s
। का प्रयोग करें या तो \s+
या [\s]+
(अनावश्यक), लेकिन [\s+]
काम नहीं करता है, विशेष रूप से यदि आप मोड़ की तरह एक भी एक साथ एक से अधिक रिक्त स्थान बदलना चाहते हैं "this example"
में "this example"
।
\s
जिसमें टैब शामिल replace(" ", "")
नहीं होंगे।
अग्रणी और अनुगामी व्हाट्सएप के लिए:
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"
pat = re.compile(r'\s+')
sub(" ", s)
नहीं करना चाहते हैं ""
और आप अब .split(" ")
टोकन का उपयोग करने में सक्षम नहीं होंगे ।
print
बयानों के उत्पादन को देखना अच्छा होगा
आप बहुत ही सरल और मूल फ़ंक्शन का उपयोग कर सकते हैं: str.replace () , व्हाट्सएप और टैब के साथ काम करता है:
>>> whitespaces = " abcd ef gh ijkl "
>>> tabs = " abcde fgh ijkl"
>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl
सरल और आसान।
#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 ']
इन रेगेक्स समाधानों को अभी तक किसी ने पोस्ट नहीं किया है।
मेल मिलाना:
>>> 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
, तो आप आंतरिक व्हाट्सएप को हटा सकते हैं, जो अवांछनीय हो सकता है।
(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' में बदल दिया जाएगा
something = "\t please_ \t remove_ all_ \n\n\n\nwhitespaces\n\t "
something = "".join(something.split())
उत्पादन:
please_remove_all_whitespaces
something = "\t please \t remove all extra \n\n\n\nwhitespaces\n\t "
something = " ".join(something.split())
उत्पादन:
कृपया सभी अतिरिक्त व्हाट्सएप को हटा दें
यदि पायथन 3 का उपयोग कर रहे हैं: अपने प्रिंट स्टेटमेंट में, sep = "" के साथ समाप्त करें। यह सभी रिक्त स्थान को अलग कर देगा।
उदाहरण:
txt="potatoes"
print("I love ",txt,"",sep="")
यह छपेगा: मुझे आलू बहुत पसंद है।
इसके बजाय: मुझे आलू बहुत पसंद है।
आपके मामले में, जब से आप \ t की सवारी प्राप्त करने की कोशिश कर रहे हैं, sep = "\ t" करें
समझ के विभिन्न डिग्री के साथ यहाँ काफी कुछ समाधानों को देखने के बाद, मैंने सोचा कि अगर स्ट्रिंग अल्पविराम से अलग हो जाए तो क्या करना चाहिए ...
संपर्क जानकारी के एक सीएसवी को संसाधित करने की कोशिश करते समय, मुझे इस समस्या का हल चाहिए था: एक्स्ट्रासियस व्हाट्सएप और कुछ जंक ट्रिम करें, लेकिन ट्रेलिंग कॉमा और आंतरिक व्हाट्सएप को संरक्षित करें। संपर्कों पर नोट्स वाले क्षेत्र के साथ काम करते हुए, मैं अच्छे सामान को छोड़कर, कचरा निकालना चाहता था। सभी विराम चिह्नों और अव्यवस्था को बाहर निकालते हुए, मैं यौगिक टोकन के बीच व्हाट्सएप को खोना नहीं चाहता था क्योंकि मैं बाद में पुनर्निर्माण नहीं करना चाहता था।
[\s_]+?\W+
पैटर्न किसी भी व्हाट्सएप चरित्र के एकल उदाहरणों और अंडरस्कोर ('_') को 1 से असीमित संख्या में आलसी (जितना संभव हो सके कुछ वर्ण) के लिए देखता है, [\s_]+?
इससे पहले कि गैर-शब्द वाले अक्षर 1 से असीमित राशि तक होते हैं। इसके साथ समय: \W+
(के बराबर है)[^a-zA-Z0-9_]
)। विशेष रूप से, यह व्हाट्सएप के swaths को ढूँढता है: null वर्ण (\ 0), tabs (\ t), newlines (\ n), फ़ीड-फ़ॉर्वर्ड (\ f), गाड़ी का रिटर्न (\ r)।
मुझे इसका फायदा दो गुना के रूप में दिखता है:
यह पूर्ण शब्दों / टोकन के बीच व्हाट्सएप को नहीं हटाता है जिसे आप एक साथ रखना चाहते हैं;
पायथन का स्ट्रिंग विधि में बनाया गया स्ट्रिंग 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()
ठीक है। लेकिन अगर चीजें अधिक जटिल हो जाती हैं, तो रेगेक्स और एक समान पैटर्न अधिक सामान्य सेटिंग्स के लिए कुछ मूल्य का हो सकता है।
अनुवाद का प्रयास करें
>>> 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'
यदि आप स्ट्रिंग की शुरुआत और अंत में व्हाट्सएप ट्रिम करना चाहते हैं, तो आप कुछ इस तरह से कर सकते हैं:
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!"
इस अंतिम उदाहरण में, आंतरिक व्हाट्सएप के प्रत्येक अनुक्रम को एक एकल स्थान से बदल दिया गया, जबकि अभी भी स्ट्रिंग के शुरू और अंत में व्हाट्सएप को ट्रिम कर रहा है।
आम तौर पर, मैं निम्नलिखित विधि का उपयोग कर रहा हूं:
>>> 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" को हटाने के लिए है। यह अतिरिक्त स्थान नहीं हटाता है।
स्ट्रिंग के बीच से व्हाट्सएप हटाने के लिए
$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;
उत्पादन:
ATGCGACACGATCGACC
यह एक स्ट्रिंग की शुरुआत और अंत दोनों से सभी व्हाट्सएप और नईलाइन्स को हटा देगा:
>>> s = " \n\t \n some \n text \n "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"
s.strip()
वास्तव में ऐसा करता है तो रेगेक्स का उपयोग क्यों करें ?
s.strip()
केवल अन्य अवांछित वर्णों को हटाने के बाद प्रारंभिक सफेद स्थान को संभालता है, लेकिन व्हाट्सएप को "खोजा" नहीं गया है। ध्यान दें कि यह अंतिम अग्रणी के बाद भी व्हाट्सएप को हटा देगा\n
s.strip()
आपके रेगेक्स के समान ही परिणाम उत्पन्न करता है।