Ho la seguente stringa:
input = "I love programming with Python-3.3! Do you? It"s great... I give it a 10/10. It"s free-to-use, no $$$ involved!"
Tutta la punteggiatura deve essere separata dalle parole EXCEPT per "/", "" "," - "," + "e" $ ".
Quindi l'output dovrebbe essere:
"I love programming with Python-3 . 3 ! Do you ? It"s great . . . I give it a 10/10. It"s free-to-use , no $$$ involved !"
Ho usato il seguente codice:
for x in string.punctuation:
if x == "/":
continue
if x == """:
continue
if x == "-":
continue
if x == "+":
continue
if x == "$":
continue
input = input.replace(x," %s " % x)
Ottengo il seguente risultato:
I love programming with Python-3 . 3 ! Do you ? It"s great . . . I give it a 10/10 . It"s free-to-use , no $$$ involved !
Funziona, ma il problema è che a voltelascia DUE spazi tra la punteggiatura e la parola, ad esempio tra il primo punto esclamativo nella frase e la parola "Do". Questo perché c'è già uno spazio tra di loro.
Questo problema si presenterebbe anche con: input = "Hello. (Hi)". L'output sarebbe:
" Hello . ( hi ) "
Annota i due spazi prima della parentesi aperta.
Ho bisogno dell'output con un solo spazio tra qualsiasila punteggiatura e le parole, ad eccezione delle 5 punteggiature sopra menzionate, che non sono separate dalle parole. Come posso risolvere questo? O c'è un modo migliore per farlo usando regex?
Grazie in anticipo.
risposte:
3 per risposta № 1Sembra re
puoi farlo per te ...
>>> import re
>>> re.sub(r"([w/"+$s-]+|[^w/"+$s-]+)s*", r"1 ", input)
"I love programming with Python-3 . 3 ! Do you ? It"s great ... I give it a 10/10 . It"s free- to-use , no $$$ involved ! "
e
>>> re.sub(r"([w/"+$s-]+|[^w/"+$s-]+)s*", r"1 ", "Hello. (hi)")
"Hello . ( hi ) "
Se lo spazio finale è un problema, .rtrim(theresult, " ")
dovresti sistemarlo per te :-)
0 per risposta № 2
Posso provare in questo modo:
>>> import string
>>> input = "I love programming with Python-3.3! Do you? It"s great... I give it a 10/10. It"s free-to-use, no $$$ involved!"
>>> ls = []
>>> for x in input:
... if x in string.punctuation:
... ls.append(" %s" % x)
... else:
... ls.append(x)
...
>>> "".join(ls)
"I love programming with Python -3 .3 ! Do you ? It "s great . . . I give it a 10 /10 . It "s free -to -use , no $ $ $ involved !"
>>>
0 per risposta № 3
Impossibile commentare a causa della mancanza di reputazione, ma in questo caso qui
tra il primo punto esclamativo nella frase e la parola "Do"
Sembra che ci siano due spazi perché c'è già uno spazio tra! e fai
! Fare
Quindi, se c'è già uno spazio dopo la punteggiatura, non mettere un altro spazio.
Inoltre, c'è una domanda simile qui: regex python inserendo uno spazio tra punteggiatura e lettere
Quindi forse prendere in considerazione l'utilizzo re
?
0 per risposta № 4
Mi sembra che una classe di caratteri negata sia più semplice:
import re
input_string = "I love programming with Python-3.3! Do you? It"s great... I give it a 10/10. It"s free-to-use, no $$$ involved!"
print re.sub(r"s?([^ws"/-+$]+)s?", r" 1 ", input_string)
Produzione:
I love programming with Python-3 . 3 ! Do you ? It"s great ... I give it a 10/10 . It"s free-to-use , no $$$ involved !
0 per risposta № 5
# Approach 1
import re
sample_input = "I love programming with Python-3.3! Do you? It"s great... I give it a 10/10. It"s free-to-use, no $$$ involved!"
sample_input = re.sub(r"([^s])([^w/"+$s-])", r"1 2", sample_input)
print(re.sub(r"([^w/"+$s-])([^s])", r"1 2", sample_input))
# Approach 2
import string
sample_input = "I love programming with Python-3.3! Do you? It"s great... I give it a 10/10. It"s free-to-use, no $$$ involved!"
punctuation = string.punctuation.replace("/", "").replace(""", "")
.replace("-", "").replace("+", "").replace("$", "")
i = 0
while i < len(sample_input):
if sample_input[i] not in punctuation:
i += 1
continue
if i > 0 and sample_input[i-1] != " ":
sample_input = sample_input[:i] + " " + sample_input[i:]
i += 1
if i + 1 < len(sample_input) and sample_input[i+1] != " ":
sample_input = sample_input[:i+1] + " " + sample_input[i+1:]
i += 1
i += 1
print(sample_input)