एक स्ट्रिंग से विराम चिह्न पट्टी करने का सबसे अच्छा तरीका


636

ऐसा लगता है कि इससे भी सरल तरीका होना चाहिए:

import string
s = "string. With. Punctuation?" # Sample string 
out = s.translate(string.maketrans("",""), string.punctuation)

है?


3
मेरे लिए बहुत सीधा लगता है। आप इसे क्यों बदलना चाहते हैं? यदि आप चाहते हैं कि यह आसान हो, तो बस वही लिखें, जो आपने किसी फ़ंक्शन में लिखा था।
हनीस ओवेन

2
खैर, यह काम करने के लिए str.translate के साइड इफेक्ट की तरह का उपयोग करने के लिए हैक की तरह लग रहा था। मैं सोच रहा था कि str.strip (chars) की तरह कुछ और भी हो सकता है, जो मुझे याद किए गए सीमाओं के बजाय पूरे स्ट्रिंग पर काम करता है।
लॉरेंस जॉनसन

2
डेटा पर भी निर्भर करता है। डेटा पर इसका उपयोग करना जहां नाम के हिस्से के रूप में अंडरस्कोर के साथ सर्वर नाम हैं (सुंदर कुछ स्थानों पर) खराब हो सकते हैं। बस यह सुनिश्चित करें कि आप डेटा को जानते हैं और यह क्या अनुमान लगाता है या आप क्लॉटिक समस्या के सबसेट के साथ समाप्त हो सकते हैं।
ईबीग्रीन

54
यह भी निर्भर करता है कि आप विराम चिह्न को क्या कहते हैं। " The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees." वास्तव में एक विराम चिह्न वर्ण शामिल है, दूसरा ""।
जॉन माकिन

37
मुझे आश्चर्य है कि किसी ने उल्लेख नहीं किया कि string.punctuationइसमें गैर-अंग्रेजी विराम चिह्न शामिल नहीं है। मैं thinking ,!? “×" "。 के बारे में सोच रहा हूं, और इसी तरह।
Clément

जवाबों:


928

दक्षता के नजरिए से आप बाजी नहीं मारेंगे

s.translate(None, string.punctuation)

पायथन के उच्च संस्करणों के लिए निम्नलिखित कोड का उपयोग करें:

s.translate(str.maketrans('', '', string.punctuation))

यह लुकिंग टेबल के साथ C में कच्चे स्ट्रिंग ऑपरेशन कर रहा है - ऐसा बहुत नहीं है जो इसे हरा देगा लेकिन अपना सी कोड लिख देगा।

यदि गति चिंता का विषय नहीं है, तो एक और विकल्प है:

exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)

यह प्रत्येक वर्ण के साथ s.replace की तुलना में तेज़ है, लेकिन रेगेक्स या string.translate जैसे गैर-शुद्ध पायथन दृष्टिकोण के साथ प्रदर्शन नहीं करेगा, जैसा कि आप नीचे दिए गए समय से देख सकते हैं। इस प्रकार की समस्या के लिए, इसे यथासंभव निम्न स्तर पर करना बंद कर देता है।

समय कोड:

import re, string, timeit

s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))

def test_set(s):
    return ''.join(ch for ch in s if ch not in exclude)

def test_re(s):  # From Vinko's solution, with fix.
    return regex.sub('', s)

def test_trans(s):
    return s.translate(table, string.punctuation)

def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s

print "sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)

यह निम्नलिखित परिणाम देता है:

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

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

29
बहुत बढ़िया जवाब। आप तालिका को हटाकर इसे सरल बना सकते हैं। डॉक्स का कहना है: "केवल अनुवाद वर्णों के लिए तालिका तर्क को सेट करें जो केवल वर्णों को हटाते हैं" ( docs.python.org/library/stdtypes.html#str.translate )
अलेक्जेंड्रो मैरिनो

3
ध्यान देने योग्य बात यह भी है कि अनुवाद () स्ट्रॉग और यूनिकोड ऑब्जेक्ट के लिए अलग-अलग व्यवहार करता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि आप हमेशा एक ही डेटा टाइप के साथ काम कर रहे हैं, लेकिन इस उत्तर में दृष्टिकोण दोनों के लिए समान रूप से काम करता है, जो कि आसान है।
रिचर्ड जे।

36
Python3 में, के table = string.maketrans("","")साथ प्रतिस्थापित किया जाना चाहिए table = str.maketrans({key: None for key in string.punctuation})?
स्पार्कआंडशाइन

19
पायथन 3.6 के रूप में चर्चा को अद्यतन करने के लिए, regexअब सबसे कुशल तरीका है! यह ट्रांसलेशन की तुलना में लगभग 2x तेज है। इसके अलावा, सेट और प्रतिस्थापित अब इतने बुरे नहीं हैं! वे दोनों 4 के कारक से बेहतर हुए हैं :)
रयान सोकलास्की

143

यदि आप उन्हें जानते हैं, तो नियमित अभिव्यक्ति काफी सरल है।

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)

4
@ सामान्य विवरण: खाली स्ट्रिंग के साथ वर्ण (अक्षर) या रिक्त स्थान नहीं बदलता है। हालांकि सावधान रहें, the \ w उदाहरण के लिए आमतौर पर अंडरस्कोर से मेल खाता है।
मथायस

4
@ श्रीसमल को लगता है कि यह यूनीकोड ​​के साथ यूनिकोड ध्वज सेट के साथ काम करेगा, अर्थात s = re.sub(r'[^\w\s]','',s, re.UNICODE)। यह 3 अक्षरों के साथ ध्वज के बिना भी काम करता है, लिनक्स पर अजगर 3 के साथ इसका परीक्षण करना, th்।
मथायस

@ मैथियास मैंने मैक पर पायथन 3.6.5 के साथ कोड की कोशिश की, तमिल अक्षर आउटपुट थोड़ा अलग दिखता है, इनपुट தமழ் हो जाता है। मुझे तमिल के बारे में कोई जानकारी नहीं है, यकीन नहीं तो उम्मीद है।
शिउमिंग

70

उपयोग की सुविधा के लिए, मैं पाइथन 2 और पाइथन दोनों में एक स्ट्रिंग से स्ट्रिपिंग विराम चिह्न का नोट जमा करता हूं। कृपया विस्तृत विवरण के लिए अन्य उत्तरों को देखें।


अजगर २

import string

s = "string. With. Punctuation?"
table = string.maketrans("","")
new_s = s.translate(table, string.punctuation)      # Output: string without punctuation

अजगर ३

import string

s = "string. With. Punctuation?"
table = str.maketrans(dict.fromkeys(string.punctuation))  # OR {key: None for key in string.punctuation}
new_s = s.translate(table)                          # Output: string without punctuation

51
myString.translate(None, string.punctuation)

4
आह, मैंने यह कोशिश की, लेकिन यह सभी मामलों में काम नहीं करता है। myString.translate (string.maketrans ("", ""), string.punctuation) ठीक काम करता है।
ऐदन केन

12
ध्यान दें कि strपायथन 3 के लिए, और unicodeपायथन 2 में, deletecharsतर्क समर्थित नहीं है।
एजीएफ

4
myString.translate (string.maketrans ("", ""), string.punctuation) यूनिकोड स्ट्रिंग्स के साथ काम नहीं करेगा (हार्ड तरीका पाया गया)
मार्क मैक्समिस्टर

44
TypeError: translate() takes exactly one argument (2 given):(
ब्रायन टिंगल

3
@BrianTingle: मेरी टिप्पणी में पायथन 3 कोड को देखें (यह एक तर्क पास करता है)। पायथन 2 कोड देखने के लिए लिंक का अनुसरण करें, जो यूनिकोड और उसके पायथन 3 अनुकूलन के
17:15

29

मैं आमतौर पर कुछ इस तरह का उपयोग करता हूं:

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

2
एक बदसूरत वन-लाइनर reduce(lambda s,c: s.replace(c, ''), string.punctuation, s):।
jfs

1
महान, हालांकि कुछ हाइफ़न की तरह लंबे समय तक दर्द को दूर नहीं करता है
व्लादिमीर

25

string.punctuationASCII ही है ! यूनिकोडेटा मॉड्यूल का उपयोग करने के लिए एक अधिक सही (लेकिन बहुत धीमा) तरीका है:

# -*- coding: utf-8 -*-
from unicodedata import category
s = u'String — with -  «punctation »...'
s = ''.join(ch for ch in s if category(ch)[0] != 'P')
print 'stripped', s

आप अन्य प्रकार के पात्रों को भी सामान्य कर सकते हैं और पट्टी कर सकते हैं:

''.join(ch for ch in s if category(ch)[0] not in 'SP')

यह ऐसे चरित्रों को भी छीन लेगा ~*+§$जो किसी के दृष्टिकोण के आधार पर "विराम चिह्न" हो सकते हैं या नहीं भी हो सकते हैं।


3
आप कर सकते हैं:regex.sub(ur"\p{P}+", "", text)
12

दुर्भाग्य से, चीजें जैसे ~विराम चिह्न श्रेणी का हिस्सा नहीं हैं। आपको सिंबल श्रेणी के लिए भी परीक्षण करना होगा।
CJ जैक्सन

24

जरूरी नहीं कि सरल हो, लेकिन एक अलग तरीका है, अगर आप फिर से परिवार से परिचित हैं।

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)

1
कार्य करता है क्योंकि string.punctuation में अनुक्रम है, -। उचित, आरोही, कोई अंतराल, ASCII आदेश में। जबकि पायथन के पास यह अधिकार है, जब आप string.punctuation के सबसेट का उपयोग करने का प्रयास करते हैं, तो यह "-" आश्चर्य के कारण शो-स्टॉपर हो सकता है।
S.Lott

2
दरअसल, यह अभी भी गलत है। अनुक्रम "\" एक भागने के रूप में माना जाता है (संयोग से एक और असफलता को दरकिनार करते हुए] बंद नहीं करता है), लेकिन \ unescaped छोड़ देता है। इसे रोकने के लिए आपको re.escape (string.punctuation) का उपयोग करना चाहिए।
ब्रायन

1
हां, मैंने इसे छोड़ दिया क्योंकि यह उदाहरण के लिए चीजों को सरल रखने के लिए काम करता था, लेकिन आप सही हैं कि इसे शामिल किया जाना चाहिए।
Vinko Vrsalovic

13

पायथन 3 strया पायथन 2 unicodeमूल्यों के लिए, str.translate()केवल एक शब्दकोश लेता है; कोडपॉइंट (पूर्णांक) को उस मैपिंग में देखा जाता है और जो भी मैप किया जाता Noneहै उसे हटा दिया जाता है।

हटाने के लिए (कुछ?) विराम चिह्न तब उपयोग करें:

import string

remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)

dict.fromkeys()वर्ग विधि यह तुच्छ करने के लिए सभी मूल्यों की स्थापना मानचित्रण नहीं बना, बनाता है Noneचाबियों का अनुक्रम पर आधारित है।

सभी विराम चिह्न को हटाने के लिए , न केवल ASCII विराम चिह्न, आपकी तालिका को थोड़ा बड़ा होना चाहिए; देखिए JF सेबेस्टियन का जवाब (पायथन 3 संस्करण):

import unicodedata
import sys

remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
                                 if unicodedata.category(chr(i)).startswith('P'))

यूनिकोड का समर्थन करने के लिए, string.punctuationपर्याप्त नहीं है। मेरा जवाब
jfs

@JFSebastian: वास्तव में, मेरा उत्तर सिर्फ शीर्ष-मतदान वाले पात्रों का उपयोग कर रहा था। अपनी तालिका का एक पायथन 3 संस्करण जोड़ा।
मार्टिन पीटर्स

शीर्ष मतदान का जवाब केवल आस्की के लिए काम करता है। आपका उत्तर स्पष्ट रूप से यूनिकोड समर्थन का दावा करता है।
8

1
@JFSebastian: यह यूनिकोड स्ट्रिंग्स के लिए काम करता है। यह ASCII विराम चिह्न छीनता है। मैंने कभी दावा नहीं किया कि यह सभी विराम चिह्नों को दर्शाता है। :-) बिंदु यह था कि unicodeपाइथन बनाम 2 strऑब्जेक्ट्स के लिए सही तकनीक प्रदान की जाए ।
मार्टिन पीटर्स

12

string.punctuationविराम चिह्नों के भार को याद करता है जो आमतौर पर वास्तविक दुनिया में उपयोग किया जाता है। गैर-एएससीआई विराम चिह्न के लिए काम करने वाले समाधान के बारे में कैसे?

import regex
s = u"string. With. Some・Really Weird、Non?ASCII。 「(Punctuation)」?"
remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
remove.sub(u" ", s).strip()

व्यक्तिगत रूप से, मेरा मानना ​​है कि पायथन में एक स्ट्रिंग से विराम चिह्न हटाने का यह सबसे अच्छा तरीका है:

  • यह सभी यूनिकोड विराम चिह्नों को हटा देता है
  • यह आसानी से परिवर्तनीय है, उदाहरण के लिए, \{S}यदि आप विराम चिह्न को हटाना चाहते हैं , तो हटा सकते हैं, लेकिन जैसे प्रतीक रख सकते हैं $
  • आप वास्तव में विशिष्ट प्राप्त कर सकते हैं कि आप क्या रखना चाहते हैं और आप क्या हटाना चाहते हैं, उदाहरण के लिए \{Pd}केवल डैश हटा देगा।
  • यह रेगेक्स व्हाट्सएप को भी सामान्य करता है। यह टैब, गाड़ी के रिटर्न, और अन्य विषमताओं को अच्छे, एकल स्थानों पर मैप करता है।

इसमें यूनिकोड वर्ण गुणों का उपयोग किया गया है, जिसे आप विकिपीडिया पर अधिक पढ़ सकते हैं


9

मैंने यह उत्तर अभी तक नहीं देखा है। बस एक रेगेक्स का उपयोग करें; यह शब्द वर्णों ( \w) और संख्या वर्णों ( \d) के अलावा सभी वर्णों को हटा देता है , उसके बाद एक व्हाट्सएप वर्ण ( \s):

import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(ur'[^\w\d\s]+', '', s)

1
\dयह बेमानी है क्योंकि यह एक सबसेट है \w
बजे ब्लश

संख्या वर्णों को वर्ड वर्णों का सबसेट माना जाता है? मैंने सोचा था कि एक शब्द चरित्र कोई भी चरित्र था जो एक वास्तविक शब्द का निर्माण कर सकता है, उदाहरण के लिए ए-जेडए-जेड?
ब्लेयरग 23

हां, रेगेक्स में एक "शब्द" में अक्षर, संख्या और अंडरस्कोर शामिल हैं। कृपया \wप्रलेखन के लिए विवरण देखें : docs.python.org/3/library/re.html
19 को ब्लशिंग

8

यहाँ पायथन 3.5 के लिए एक-लाइनर है:

import string
"l*ots! o(f. p@u)n[c}t]u[a'ti\"on#$^?/".translate(str.maketrans({a:None for a in string.punctuation}))

7

यह सबसे अच्छा समाधान नहीं हो सकता है लेकिन यह है कि मैंने इसे कैसे किया।

import string
f = lambda x: ''.join([i for i in x if i not in string.punctuation])

6

यहाँ एक समारोह है जो मैंने लिखा है। यह बहुत कुशल नहीं है, लेकिन यह सरल है और आप अपनी इच्छा के अनुसार किसी भी विराम चिह्न को जोड़ या हटा सकते हैं:

def stripPunc(wordList):
    """Strips punctuation from list of words"""
    puncList = [".",";",":","!","?","/","\\",",","#","@","$","&",")","(","\""]
    for punc in puncList:
        for word in wordList:
            wordList=[word.replace(punc,'') for word in wordList]
    return wordList

5
import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(r'[^a-zA-Z0-9\s]', '', s)

ऐसा लगता है कि केवल ASCII वर्णों के लिए काम करेगा।
avirr

5

एक अद्यतन के रूप में, मैंने पायथन 3 में @Brian उदाहरण को फिर से लिखा और फ़ंक्शन के अंदर regex संकलन चरण को स्थानांतरित करने के लिए इसमें परिवर्तन किए। मेरे विचार से फंक्शन वर्क करने के लिए जरूरी हर एक कदम का समय था। शायद आप वितरित कंप्यूटिंग का उपयोग कर रहे हैं और आपके कार्यकर्ताओं के बीच regex ऑब्जेक्ट साझा नहीं हो सकता है और re.compileप्रत्येक कार्यकर्ता पर कदम रखने की आवश्यकता है । इसके अलावा, मैं पायथन 3 के लिए दो अलग-अलग कार्यान्वयनों के लिए उत्सुक था

table = str.maketrans({key: None for key in string.punctuation})

बनाम

table = str.maketrans('', '', string.punctuation)

साथ ही मैंने सेट का उपयोग करने के लिए एक और तरीका जोड़ा, जहां मैं पुनरावृत्तियों की संख्या को कम करने के लिए चौराहे के कार्य का लाभ उठाता हूं।

यह पूरा कोड है:

import re, string, timeit

s = "string. With. Punctuation"


def test_set(s):
    exclude = set(string.punctuation)
    return ''.join(ch for ch in s if ch not in exclude)


def test_set2(s):
    _punctuation = set(string.punctuation)
    for punct in set(s).intersection(_punctuation):
        s = s.replace(punct, ' ')
    return ' '.join(s.split())


def test_re(s):  # From Vinko's solution, with fix.
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    return regex.sub('', s)


def test_trans(s):
    table = str.maketrans({key: None for key in string.punctuation})
    return s.translate(table)


def test_trans2(s):
    table = str.maketrans('', '', string.punctuation)
    return(s.translate(table))


def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s


print("sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000))
print("sets2      :",timeit.Timer('f(s)', 'from __main__ import s,test_set2 as f').timeit(1000000))
print("regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000))
print("translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000))
print("translate2 :",timeit.Timer('f(s)', 'from __main__ import s,test_trans2 as f').timeit(1000000))
print("replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000))

यह मेरे परिणाम है:

sets      : 3.1830138750374317
sets2      : 2.189873124472797
regex     : 7.142953420989215
translate : 4.243278483860195
translate2 : 2.427158243022859
replace   : 4.579746678471565

4
>>> s = "string. With. Punctuation?"
>>> s = re.sub(r'[^\w\s]','',s)
>>> re.split(r'\s*', s)


['string', 'With', 'Punctuation']

2
कृपया अधिक जानकारी के साथ संपादित करें। कोड-ओनली एंड "ट्राय दिस" जवाबों को हतोत्साहित किया जाता है, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं होती है, और यह नहीं समझाते कि किसी को "कोशिश" क्यों करनी चाहिए।
परितोष

4

यहाँ रेगेक्स के बिना एक समाधान है।

import string

input_text = "!where??and!!or$$then:)"
punctuation_replacer = string.maketrans(string.punctuation, ' '*len(string.punctuation))    
print ' '.join(input_text.translate(punctuation_replacer).split()).strip()

Output>> where and or then
  • रिक्त स्थान के साथ विराम चिह्न बदलता है
  • एक ही स्थान के साथ शब्दों के बीच में कई रिक्त स्थान बदलें
  • स्ट्रिपिंग स्पेस निकालें, अगर स्ट्रिप के साथ कोई हो ()

4

एक-लाइनर बहुत सख्त मामलों में मददगार नहीं हो सकता है:

''.join([c for c in s if c.isalnum() or c.isspace()])

2
#FIRST METHOD
#Storing all punctuations in a variable    
punctuation='!?,.:;"\')(_-'
newstring='' #Creating empty string
word=raw_input("Enter string: ")
for i in word:
     if(i not in punctuation):
                  newstring+=i
print "The string without punctuation is",newstring

#SECOND METHOD
word=raw_input("Enter string: ")
punctuation='!?,.:;"\')(_-'
newstring=word.translate(None,punctuation)
print "The string without punctuation is",newstring


#Output for both methods
Enter string: hello! welcome -to_python(programming.language)??,
The string without punctuation is: hello welcome topythonprogramminglanguage

2
with open('one.txt','r')as myFile:

    str1=myFile.read()

    print(str1)


    punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"] 

for i in punctuation:

        str1 = str1.replace(i," ") 
        myList=[]
        myList.extend(str1.split(" "))
print (str1) 
for i in myList:

    print(i,end='\n')
    print ("____________")

0

आप में से कोई भी इसका उपयोग क्यों नहीं करता है?

 ''.join(filter(str.isalnum, s)) 

बहुत धीमा?


ध्यान दें कि यह रिक्त स्थान को भी हटा देगा।
जॉर्जी

0

यूनिकोड को ध्यान में रखते हुए। Python3 में कोड की जाँच की गई।

from unicodedata import category
text = 'hi, how are you?'
text_without_punc = ''.join(ch for ch in text if not category(ch).startswith('P'))

-1

पायथन का उपयोग करके टेक्स्ट फाइल से स्टॉप शब्द हटाएं

print('====THIS IS HOW TO REMOVE STOP WORS====')

with open('one.txt','r')as myFile:

    str1=myFile.read()

    stop_words ="not", "is", "it", "By","between","This","By","A","when","And","up","Then","was","by","It","If","can","an","he","This","or","And","a","i","it","am","at","on","in","of","to","is","so","too","my","the","and","but","are","very","here","even","from","them","then","than","this","that","though","be","But","these"

    myList=[]

    myList.extend(str1.split(" "))

    for i in myList:

        if i not in stop_words:

            print ("____________")

            print(i,end='\n')

-2

मैं इस तरह एक समारोह का उपयोग करना चाहते हैं:

def scrub(abc):
    while abc[-1] is in list(string.punctuation):
        abc=abc[:-1]
    while abc[0] is in list(string.punctuation):
        abc=abc[1:]
    return abc

1
यह शुरू और अंत से अलग-अलग अक्षर हैं; abc.strip(string.punctuation)इसके बदले उपयोग करें । यह ऐसे पात्रों को बीच में नहीं हटाएगा ।
मार्टिज़न पीटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.