2010-09-08 53 views
50

Tengo una cadena como esta¿Cómo comprobar si un carácter está en mayúscula en Python?

>>> x="Alpha_beta_Gamma" 
>>> words = [y for y in x.split('_')] 
>>> words 
['Alpha', 'beta', 'Gamma'] 

Quiero salida diciendo X es no conformes como el segundo elemento de las palabras de la lista comienza con una letra minúscula y si la cadena x = "Alpha_Beta_Gamma" entonces se debe imprimir la cadena es conforme

+0

¿Qué pasa con una x = "Alpha_BEta_Gamma"? –

+0

Buena captura Alpha_BEta_Gamma está inutilizada, ya que debería ser Alpha_Beta_Gamma – lisa

+0

¿está utilizando Python3? –

Respuesta

51

Tal vez usted quiere str.istitle

>>> help(str.istitle) 
Help on method_descriptor: 

istitle(...) 
    S.istitle() -> bool 

    Return True if S is a titlecased string and there is at least one 
    character in S, i.e. uppercase characters may only follow uncased 
    characters and lowercase characters only cased ones. Return False 
    otherwise. 

>>> "Alpha_beta_Gamma".istitle() 
False 
>>> "Alpha_Beta_Gamma".istitle() 
True 
>>> "Alpha_Beta_GAmma".istitle() 
False 
+0

Bueno, hmm tengo que marcar todo bien aunque todas las respuestas aquí fueron correctas basadas en el requisito original i he dado. – lisa

+0

Bueno, hmm, tengo que marcar su respuesta como correcta aunque todas las respuestas aquí fueron correctas en base al requisito original que había dado. – lisa

1

Se puede utilizar esta expresión regular:

^[A-Z][a-z]*(?:_[A-Z][a-z]*)*$ 

código de ejemplo:

import re 

strings = ["Alpha_beta_Gamma", "Alpha_Beta_Gamma"] 
pattern = r'^[A-Z][a-z]*(?:_[A-Z][a-z]*)*$' 

for s in strings: 
    if re.match(pattern, s): 
     print s + " conforms" 
    else: 
     print s + " doesn't conform" 

Como se ve en codepad

+1

+1 pero podría fallar para caracteres que no sean en inglés, p. Ej. "Ălălalt". –

53

Para probar que todas las palabras comienzan con un uso mayúsculas esto:

print all(word[0].isupper() for word in words) 
+0

>>> x = "Alpha_beta_Gamma" >>> palabras = [y para y en x.split ('_')] >>> imprimir todo (palabra [0] .isupper() para palabra en palabras) Archivo "", línea 1 imprimir todo (palabra [0] .isupper() para palabra en palabras) ^ SyntaxError: sintaxis no válida – lisa

+1

@lisa: Tiene una versión de Python realmente antigua (<2.4). Escriba 'print all ([word [0] .isupper() para word en palabras])' en su lugar. –

+2

@lisa: en Python3 use 'print (all ...)' porque 'print' es una función, no una declaración. –

2
words = x.split("_") 
for word in words: 
    if word[0] == word[0].upper() and word[1:] == word[1:].lower(): 
     print word, "is conformant" 
    else: 
     print word, "is non conformant" 
+1

Una parte del código es ineficaz. Puedes reemplazarlo por 'word [0] .isupper()'. –

+1

Y la otra parte con 'palabra [1:].islower() ' – NullUserException

+0

Hola, estoy usando python 3 y me da un error – lisa

2

Usted puede utilizar este código :

def is_valid(string): 
    words = string.split('_') 
    for word in words: 
     if not word.istitle(): 
      return False, word 
    return True, words 
x="Alpha_beta_Gamma" 
assert is_valid(x)==(False,'beta') 
x="Alpha_Beta_Gamma" 
assert is_valid(x)==(True,['Alpha', 'Beta', 'Gamma']) 

Este modo se puede saber si es válido y qué palabra está mal

1
x="Alpha_beta_Gamma" 
is_uppercase_letter = True in map(lambda l: l.isupper(), x) 
print is_uppercase_letter 
>>>>True 

para que pueda escribir en 1 cadena

+0

Creo que lo consiguió al revés: OP parece querer que se imprima cierto si y solo si la primera letra (y ninguna otra) de cada palabra es en mayúscula, y con la suya, se imprime verdadero, incluso si las condiciones no se cumplen . –

Cuestiones relacionadas