/ / Python - Come separo la punteggiatura dalle parole per lo spazio bianco lasciando solo uno spazio tra la punteggiatura e la parola? - python, regex

Python - Come separare la punteggiatura dalle parole dallo spazio bianco lasciando solo uno spazio tra la punteggiatura e la parola? - python, regex

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 № 1

Sembra 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)