Python ha un build-in (nel senso delle librerie standard) per eseguire una divisione su stringhe che produce un iteratore piuttosto che un elenco? Ho in mente di lavorare su stringhe molto lunghe e di non dover consumare la maggior parte della stringa.Divisione di una stringa in un iteratore
risposta
Non dividere direttamente le stringhe in quanto tali, ma il modulo re
ha re.finditer()
(e il corrispondente metodo finditer()
su qualsiasi espressione regolare compilata).
@Zero chiesto un esempio:
>>> import re
>>> s = "The quick brown\nfox"
>>> for m in re.finditer('\S+', s):
... print(m.span(), m.group(0))
...
(0, 3) The
(4, 9) quick
(13, 18) brown
(19, 22) fox
come S. Lott, non si sa bene ciò che si desidera. Ecco il codice che può aiutare:
s = "This is a string."
for character in s:
print character
for word in s.split(' '):
print word
Ci sono anche s.index() e s.find() per trovare il carattere successivo.
tardi: Va bene, qualcosa di simile.
>>> def tokenizer(s, c):
... i = 0
... while True:
... try:
... j = s.index(c, i)
... except ValueError:
... yield s[i:]
... return
... yield s[i:j]
... i = j + 1
...
>>> for w in tokenizer(s, ' '):
... print w
...
This
is
a
string.
Vedere i chiarimenti nei commenti. Questo non risponde alla domanda. – marcog
Chiede esplicitamente anche un * built-in * –
@ 7vies: ho pensato che fosse meglio che dire "No" o "Usare le espressioni regolari (ad esempio la risposta sopra)". – hughdbrown
Si potrebbe usare qualcosa di simile SPARK (che è stato assorbito nella distribuzione di Python per sé, anche se non importabile dalla libreria standard), ma alla fine usa le espressioni regolari e in modo Duncan's answer sarebbe forse servire altrettanto bene se fosse facile come "dividere in spazi".
L'altra opzione, molto più ardua, sarebbe quella di scrivere il proprio modulo Python in C per farlo, se si desidera realmente la velocità, ma è ovviamente un investimento molto più lungo.
Se non è necessario consumare l'intera stringa, è perché si sta cercando qualcosa di specifico, giusto? Quindi cerca quello, con re
o .find()
invece di dividere. In questo modo puoi trovare la parte della stringa che ti interessa e dividerla.
Nell'applicazione che avevo in mente, volevo dividere lo spazio bianco, controllare la terza sottostringa, a seconda di cosa fosse, controllare la quarta o sesta sottostringa e quindi eventualmente elaborare il resto della stringa. –
@ metafora pitonica: Sì, se quella stringa è * veramente * lunga potresti voler usare 're' o' find'. Nell'altro caso, basta dividerlo in spazi vuoti. Non lo so, ma per me la tua domanda sembra essere un'ottimizzazione prematura. ;) Quindi devi profilarlo per essere sicuro. –
@ metafora pitonica: per il testo normale si tratta solo dell'ottimizzazione prematura. Il testo inizia ad essere "grande" da qualche parte >> 10 MB. Per l'applicazione che hai descritto, andrei con 'text.split (None, 6)' per ottenere le prime 6 parole. Se devi dividere l'intero testo, fallo subito. –
Vedere itertools
. Contiene cose come takewhile
, islice
e groupby
che ti consentono di suddividere un iterabile (una stringa è iterabile) in un altro iterabile basato su indici o condizioni di tipo booleane.
Non esiste un analogico basato su iteratore incorporato di str.split
. A seconda delle esigenze si potrebbe fare una lista iteratore:
iterator = iter("abcdcba".split("b"))
iterator
# <list_iterator at 0x49159b0>
next(iterator)
# 'a'
Tuttavia, uno strumento da questa libreria di terze parti probabilmente offre ciò che si vuole, more_itertools.split_at
. Vedi anche this post per un esempio.
- 1. Divisione di una stringa nell'array
- 2. Divisione selettiva di una stringa in Perl
- 3. Divisione di una stringa sul primo spazio
- 4. Divisione stringa di input per una calcolatrice
- 5. C++: divisione di una stringa in una matrice
- 6. Come convertire iteratore di caratteri in stringa?
- 7. speciale divisione stringa in Ruby
- 8. Stringa di divisione con delimitatore
- 9. Divisione di una stringa utilizzando Regex in Java
- 10. divisione di una stringa in base alla scheda nel file
- 11. Divisione di una stringa in tutti gli spazi vuoti
- 12. Grails: divisione di una stringa che contiene una pipe
- 13. Estrarre un iteratore Prendere in una tupla
- 14. Comportamento imprevisto di iteratore su stringa
- 15. dereferencing rendimenti stringa iteratore int
- 16. JS - Divisione di una stringa e looping dei risultati
- 17. Divisione di una stringa mediante l'elenco degli indici
- 18. Divisione di una stringa/numero ogni n. Carattere/numero?
- 19. Divisione utilizzando una staffa
- 20. divisione stringa sull'ultima virgola in R
- 21. Divisione di una stringa in java su più di un simbolo
- 22. Divisione stringa Java con "." (punto)
- 23. C++ divisione stringa per riga
- 24. Divisione di una stringa con caratteri ripetuti in un elenco utilizzando regex
- 25. Divisione di una stringa separata da virgola in un processo memorizzato PL/SQL
- 26. Come assegnare un valore alla variabile da una divisione di stringa in groovy?
- 27. Esiste una funzione di divisione in xpath?
- 28. Divisione di una colonna in più colonne
- 29. Dichiarazione di un iteratore in Java
- 30. Divisione di una stringa senza interruzioni di riga in un elenco di righe con un numero massimo di colonne
"non è necessario consumare la maggior parte della stringa"? Cosa significa questo? L'oggetto stringa è tutto in memoria, giusto? Dato che è tutto in memoria, ed è già una sequenza, non c'è nulla di necessario per iterare sui personaggi. Puoi definire cosa intendi per "non è necessario consumare la maggior parte della stringa"? –
Sì, la stringa è già in memoria. Ma non ho bisogno di attraversare l'intera stringa per capire dove dividere o creare le sottostringhe risultanti dalla divisione. –
Forse hai bisogno di un tokeniser o scanner di qualche tipo che fornisce un iteratore. La risposta qui sotto con la soluzione di espressione regolare potrebbe funzionare. –