¿Hay una manera estándar de Python para TitleCase una cadena (es decir, las palabras comienzan con mayúsculas, todos los caracteres alfabéticos restantes tienen minúscula) pero los artículos que salen como and
, in
y of
en minúsculas?
python
string
title-case
yassin
fuente
fuente
re
necesario? Hay una"".split
función que hace lo mismo.str.split
no considera espacios contiguos.re.split
retiene espacios. Entonces, esta función no ocupa ningún espacio."".split()
no los tenía en cuenta, pero lo"".split(" ")
hizo.title_except('a whim of aN elephant', articles)
caso. Puede utilizar laword.lower() in exceptions
condición de filtrado para solucionarlo.2001 a Space Odyssey
debería volver2001 A Space Odyssey
, dondea
se escribe en mayúscula, ya que sigue a un número. Gracias por adelantado.¡Utilice el módulo titlecase.py ! Funciona solo para inglés.
>>> from titlecase import titlecase >>> titlecase('i am a foobar bazbar') 'I Am a Foobar Bazbar'
GitHub: https://github.com/ppannuto/python-titlecase
fuente
Existen estos métodos:
>>> mytext = u'i am a foobar bazbar' >>> print mytext.capitalize() I am a foobar bazbar >>> print mytext.title() I Am A Foobar Bazbar
No hay opción de artículo en minúsculas. Tendría que codificarlo usted mismo, probablemente usando una lista de artículos que desea reducir.
fuente
Stuart Colville ha realizado una adaptación de Python de un script de Perl escrito por John Gruber para convertir cadenas en mayúsculas y minúsculas, pero evita usar mayúsculas en palabras pequeñas según las reglas del Manual de estilo del New York Times, además de atender varios casos especiales.
Parte de la inteligencia de estos guiones:
escriben con mayúscula palabras pequeñas como if, in, of, on , etc., pero las quitarán de mayúscula si se escriben con mayúscula errónea en la entrada.
los guiones asumen que las palabras con letras mayúsculas distintas del primer carácter ya están en mayúscula correctamente. Esto significa que dejarán una palabra como "iTunes" sola, en lugar de convertirla en "ITunes" o, peor aún, "Itunes".
omiten cualquier palabra con puntos de línea; “Example.com” y “del.icio.us” permanecerán en minúsculas.
tienen trucos codificados específicamente para tratar casos extraños, como "AT&T" y "Q&A", los cuales contienen palabras pequeñas (arroba y a) que normalmente deben estar en minúsculas.
La primera y la última palabra del título siempre se escriben con mayúscula, por lo que una entrada como "Nada que temer" se convertirá en "Nada que temer".
Una pequeña palabra después de dos puntos se escribirá en mayúscula.
Puedes descargarlo aquí .
fuente
Esto debería bastar. Lo entiendo de otra manera.
>>> mytext = u'i am a foobar bazbar' >>> mytext.capitalize() u'I am a foobar bazbar' >>>
De acuerdo, como se dijo en la respuesta anterior, debe hacer una mayúscula personalizada:
mytext = u'yo soy un foobar bazbar '
def xcaptilize(word): skipList = ['a', 'an', 'the', 'am'] if word not in skipList: return word.capitalize() return word k = mytext.split(" ") l = map(xcaptilize, k) print " ".join(l)
Esto salidas
fuente
El método de título de Python 2.7 tiene una falla.
devolverá Carpenter ' S Assistant cuando el valor sea Carpenter 's Assistant
La mejor solución es probablemente la de @BioGeek usando titlecase de Stuart Colville. Cuál es la misma solución propuesta por @Etienne.
fuente
not_these = ['a','the', 'of'] thestring = 'the secret of a disappointed programmer' print ' '.join(word if word in not_these else word.title() for word in thestring.capitalize().split(' ')) """Output: The Secret of a Disappointed Programmer """
El título comienza con una palabra en mayúscula y no coincide con el artículo.
fuente
Una línea usando la comprensión de listas y el operador ternario
reslt = " ".join([word.title() if word not in "the a on in of an" else word for word in "Wow, a python one liner for titles".split(" ")]) print(reslt)
Descompostura:
for word in "Wow, a python one liner for titles".split(" ")
Divide la cadena en una lista e inicia un ciclo for (en la comprensión de la lista)word.title() if word not in "the a on in of an" else word
usa el método nativotitle()
para titular la cadena en mayúsculas y minúsculas si no es un artículo" ".join
une los elementos de la lista con un separador de (espacio)fuente
Un caso importante que no se está considerando son los acrónimos (la solución python-titlecase puede manejar acrónimos si los proporciona explícitamente como excepciones). En cambio, prefiero simplemente evitar la reducción de la carcasa. Con este enfoque, los acrónimos que ya están en mayúsculas permanecen en mayúsculas. El siguiente código es una modificación del originalmente proporcionado por dheerosaur.
# This is an attempt to provide an alternative to ''.title() that works with # acronyms. # There are several tricky cases to worry about in typical order of importance: # 0. Upper case first letter of each word that is not an 'minor' word. # 1. Always upper case first word. # 2. Do not down case acronyms # 3. Quotes # 4. Hyphenated words: drive-in # 5. Titles within titles: 2001 A Space Odyssey # 6. Maintain leading spacing # 7. Maintain given spacing: This is a test. This is only a test. # The following code addresses 0-3 & 7. It was felt that addressing the others # would add considerable complexity. def titlecase( s, exceptions = ( 'and', 'or', 'nor', 'but', 'a', 'an', 'and', 'the', 'as', 'at', 'by', 'for', 'in', 'of', 'on', 'per', 'to' ) ): words = s.strip().split(' ') # split on single space to maintain word spacing # remove leading and trailing spaces -- needed for first word casing def upper(s): if s: if s[0] in '‘“"‛‟' + "'": return s[0] + upper(s[1:]) return s[0].upper() + s[1:] return '' # always capitalize the first word first = upper(words[0]) return ' '.join([first] + [ word if word.lower() in exceptions else upper(word) for word in words[1:] ]) cases = ''' CDC warns about "aggressive" rats as coronavirus shuts down restaurants L.A. County opens churches, stores, pools, drive-in theaters UConn senior accused of killing two men was looking for young woman Giant asteroid that killed the dinosaurs slammed into Earth at ‘deadliest possible angle,’ study reveals Maintain given spacing: This is a test. This is only a test. '''.strip().splitlines() for case in cases: print(titlecase(case))
Cuando se ejecuta, produce lo siguiente:
CDC Warns About "Aggressive" Rats as Coronavirus Shuts Down Restaurants L.A. County Opens Churches, Stores, Pools, Drive-in Theaters UConn Senior Accused of Killing Two Men Was Looking for Young Woman Giant Asteroid That Killed the Dinosaurs Slammed Into Earth at ‘Deadliest Possible Angle,’ Study Reveals Maintain Given Spacing: This Is a Test. This Is Only a Test.
fuente