Risposte:
Il .title()
metodo di una stringa (ASCII o Unicode va bene) fa questo:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Tuttavia, cerca le stringhe con apostrofi incorporati, come indicato nei documenti.
L'algoritmo utilizza una semplice definizione indipendente dal linguaggio di una parola come gruppi di lettere consecutive. La definizione funziona in molti contesti ma significa che gli apostrofi nelle contrazioni e nei possessivi formano confini di parole, che potrebbero non essere il risultato desiderato:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
"e g 3b"
, il risultato desiderato sarebbe "E G 3b"
. Tuttavia, "e g 3b".title()
ritorna "E G 3B"
.
In [2]: 'tEst'.title() Out[2]: 'Test'
Il .title()
metodo non può funzionare bene,
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Provare string.capwords()
metodo,
import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
Dal documenti di Python su capwords :
Dividere l'argomento in parole usando str.split (), scrivere in maiuscolo ogni parola usando str.capitalize () e unire le parole in maiuscolo usando str.join (). Se il secondo argomento facoltativo sep è assente o Nessuno, le serie di caratteri di spazi bianchi vengono sostituite da uno spazio singolo e gli spazi bianchi iniziali e finali vengono rimossi, altrimenti sep viene utilizzato per dividere e unire le parole.
"There once was a string with an 'that had words right after it and then closed'"
. Con questo esempio tutti i mondi tranne quelli that
sono capitalizzati come previsto. Il risultato è"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
alle situazioni normali. Nella mia situazione, title()
restituisce un output negativo per i nomi con accenti o dieresi, mentre capwords()
gestito correttamente.
Solo perché questo genere di cose è divertente per me, ecco altre due soluzioni.
Dividi in parole, sigla ogni parola dai gruppi divisi e ricongiungiti. Questo cambierà lo spazio bianco che separa le parole in un unico spazio bianco, non importa quale fosse.
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
EDIT: non ricordo cosa stavo pensando quando ho scritto il codice sopra, ma non è necessario creare un elenco esplicito; possiamo usare un'espressione generatrice per farlo in modo pigro. Quindi ecco una soluzione migliore:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
Usa un'espressione regolare per abbinare l'inizio della stringa, o lo spazio bianco che separa le parole, più un singolo carattere non bianco; utilizzare le parentesi per contrassegnare "gruppi di corrispondenza". Scrivi una funzione che accetta un oggetto di corrispondenza e restituisce invariato il gruppo di corrispondenza degli spazi bianchi e il gruppo di corrispondenza dei caratteri non bianchi in maiuscolo. Quindi utilizzare re.sub()
per sostituire i motivi. Questo non ha i problemi di punteggiatura della prima soluzione, né rifà lo spazio bianco come la mia prima soluzione. Questo produce il miglior risultato.
import re
s = 'the brown fox'
def repl_func(m):
"""process regular expression match groups for word upper-casing problem"""
return m.group(1) + m.group(2).upper()
s = re.sub("(^|\s)(\S)", repl_func, s)
>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"
Sono contento di aver cercato questa risposta. Non avevo idea che re.sub()
potesse avere una funzione! È possibile eseguire elaborazioni non banali all'interno re.sub()
per produrre il risultato finale!
string.capwords
fa, secondo la documentazione nella risposta di Chen Houwu.
Ecco un riepilogo di diversi modi per farlo, funzioneranno per tutti questi input:
"" => ""
"a b c" => "A B C"
"foO baR" => "FoO BaR"
"foo bar" => "Foo Bar"
"foo's bar" => "Foo's Bar"
"foo's1bar" => "Foo's1bar"
"foo 1bar" => "Foo 1bar"
- La soluzione più semplice è dividere la frase in parole e scrivere in maiuscolo la prima lettera, quindi ricollegarla:
# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error,
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
return ' '.join(w[:1].upper() + w[1:] for w in s.split(' '))
- Se non vuoi prima dividere la stringa di input in parole e usare generatori elaborati:
# Iterate through each of the characters in the string and capitalize
# the first char and any char after a blank space
from itertools import chain
def cap_sentence(s):
return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )
- O senza importare itertools:
def cap_sentence(s):
return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )
- Oppure puoi usare espressioni regolari, dalla risposta di steveha :
# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)
Ora, queste sono alcune altre risposte che sono state pubblicate e input per i quali non funzionano come previsto se stiamo usando la definizione di una parola che è l'inizio della frase o qualcosa dopo uno spazio vuoto:
return s.title()
# Undesired outputs:
"foO baR" => "Foo Bar"
"foo's bar" => "Foo'S Bar"
"foo's1bar" => "Foo'S1Bar"
"foo 1bar" => "Foo 1Bar"
return ' '.join(w.capitalize() for w in s.split())
# or
import string
return string.capwords(s)
# Undesired outputs:
"foO baR" => "Foo Bar"
"foo bar" => "Foo Bar"
l'uso di '' per la divisione risolverà il secondo output, ma capwords () non funzionerà ancora per il primo
return ' '.join(w.capitalize() for w in s.split(' '))
# or
import string
return string.capwords(s, ' ')
# Undesired outputs:
"foO baR" => "Foo Bar"
Fai attenzione con più spazi vuoti
return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo bar" => "Foo Bar"
lower 123 upper
dovrebbe tornare lower 123 Upper
, dove upper
è in maiuscolo in quanto segue un numero. So che va oltre lo scopo della domanda del PO, ma un bel componente aggiuntivo alla tua già ampia risposta. Grazie in anticipo.
"([0-9]+)(\s+.)"
invece di "(^|\s)(\S)"
(abbina uno o più numeri, seguito da uno o più spazi, e qualsiasi carattere dopo), o "([0-9]+)(\s*.)"
se vuoi mettere in maiuscolo il carattere dopo spazi 'zero o più' dopo il numero
WW1 - the great war
e output WW1 - The Great War
invece di Ww1 ...
. Vedi il problema con le abbreviazioni? Saresti disposto ad aggiungere qualcosa che dimostri questo caso? Mi sto chiedendo da un po 'di tempo ormai e non riesco a pensare a un modo per farlo.
WW1
verrebbero emesse comeWW1
Versione copia-incolla di @jibberia anwser:
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
str.join
accetta generatori.
join
accetta gen exps, nel caso in str.join
particolare, è generalmente preferito usare una comprensione della lista. Questo perché join
scorre due volte l'argomento, quindi è più veloce fornire un elenco pronto anziché un generatore.
str.join
ripetere due volte l'argomento? Ho appena controllato - non lo fa. Sebbene per le sequenze di piccole dimensioni la comprensione dell'elenco sia più rapida.
Perché complicate la vostra vita con join e loop quando la soluzione è semplice e sicura ??
Basta fare questo:
string = "the brown fox"
string[0].upper()+string[1:]
"the brown fox".capitalize()
?
'this is John'
in 'This is john'
.
string.capitalize()
(essenzialmente riecheggiando @luckydonald)
Se str.title () non funziona per te, fai tu stesso le maiuscole.
One-liner:
>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"
Chiaro esempio:
input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
title_case_word = word[0].upper() + word[1:]
capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)
Se solo tu vuoi la prima lettera:
>>> 'hello world'.capitalize()
'Hello world'
Ma per capitalizzare ogni parola:
>>> 'hello world'.title()
'Hello World'
'hello New York'.capitalize()
è'Hello new york'
Una stringa vuota genererà un errore se accedi a [1:], quindi utilizzerei:
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
maiuscolo solo per la prima lettera.
str.capitalize
serve?
return title[:1].upper() + title[1:]
si occuperebbe anche di quel problema poiché tagliare la stringa vuota in quel modo darebbe 2 stringhe vuote, unite insieme per creare una stringa vuota che viene restituita
Come ha sottolineato Mark, dovresti usare .title()
:
"MyAwesomeString".title()
Tuttavia, se si desidera rendere la prima lettera maiuscola all'interno di un modello django , è possibile utilizzare questo:
{{ "MyAwesomeString"|title }}
o usando una variabile:
{{ myvar|title }}
Il metodo suggerito str.title () non funziona in tutti i casi. Per esempio:
string = "a b 3c"
string.title()
> "A B 3C"
invece di "A B 3c"
.
Penso che sia meglio fare qualcosa del genere:
def capitalize_words(string):
words = string.split(" ") # just change the split(" ") method
return ' '.join([word.capitalize() for word in words])
capitalize_words(string)
>'A B 3c'
Sebbene tutte le risposte siano già soddisfacenti, ma proverò a coprire i 2 casi extra insieme a tutti i casi precedenti.
se gli spazi non sono uniformi e si desidera mantenere lo stesso
string = hello world i am here.
se tutta la stringa non parte da alfabeti
string = 1 w 2 r 3g
Qui puoi usare questo
def solve(s):
a = s.split(' ')
for i in range(len(a)):
a[i]= a[i].capitalize()
return ' '.join(a)
questo ti darà
output = Hello World I Am Here
output = 1 W 2 R 3g
Spero che questo non sia ridondante.
Per scrivere in maiuscolo ...
str = "this is string example.... wow!!!";
print "str.title() : ", str.title();
@ Commento Gary02127, sotto il titolo dell'opera soluzione con apostrofo
import re
def titlecase(s):
return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)
text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))
Non trascurare la conservazione dello spazio bianco. Se vuoi elaborare 'fred flinstone'
e ottieni 'Fred Flinstone'
invece di 'Fred Flinstone'
, hai corrotto il tuo spazio bianco. Alcune delle soluzioni di cui sopra perderanno spazi bianchi. Ecco una soluzione che va bene per Python 2 e 3 e conserva gli spazi bianchi.
def propercase(s):
return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
Una funzione rapida ha funzionato per Python 3
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]
>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))
Помните своих Предковъ. Сражайся за Правду и Справедливость!
>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))
Хай живе вільна Україна! Хай живе Любовь поміж нас.
>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))
Faith and Labour make Dreams come true.
Metti in maiuscolo la stringa con spazi non uniformi
Bene, capisco che questa è una vecchia domanda e probabilmente le risposte potrebbero essere state quasi esaurite, ma vorrei aggiungere al punto di @Amit Gupta degli spazi non uniformi. Dalla domanda originale, vorremmo scrivere in maiuscolo ogni parola nella stringa s = 'the brown fox'
. E se la stringa fosse s = 'the brown fox'
con spazi non uniformi.
def solve(s):
# if you want to maintain the spaces in the string, s = 'the brown fox'
# use s.split(' ') instead of s.split().
# s.split() returns ['the', 'brown', 'fox']
# while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']
capitalized_word_list = [word.capitalize() for word in s.split(' ')]
return ' '.join(capitalized_word_list)
** Nel caso in cui si desideri ridimensionare **
#Assuming you are opening a new file
with open(input_file) as file:
lines = [x for x in reader(file) if x]
#for loop to parse the file by line
for line in lines:
name = [x.strip().lower() for x in line if x]
print(name) #check the result
Mi piace molto questa risposta:
Versione copia-incolla di @jibberia anwser:
def capitalize(line):
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])
Ma alcune delle righe che stavo inviando dividevano alcuni caratteri '' vuoti che causavano errori quando provavo a fare s [1:]. Probabilmente esiste un modo migliore per farlo, ma ho dovuto aggiungere a if len (s)> 0, come in
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])
" ".join(w.capitalize() for w in s.split())