2012-01-31 13 views
44

Co to jest najlepiej czystej implementacji Pythona, aby sprawdzić, czy ciąg zawiera żadnych liter alfabetu?Jak mogę sprawdzić, czy ciąg znaków zawiera DOWOLNE litery alfabetu?

string_1 = "(555).555-5555" 
string_2 = "(555) 555 - 5555 ext. 5555 

Gdzie string_1 wróci False za brak litery alfabetu w nim i string_2 wróci True za posiadanie listu.

+1

Czy powinno to być ograniczone wyłącznie do alfabetu angielskiego? Czy powinny być brane pod uwagę "specjalne" znaki z innych alfabetów, takich jak niemiecki? – Kotch

+0

Czy jest szansa, że ​​otrzymasz kod Unicode? A może zwykłe rzymskie litery? – KobeJohn

+0

Nice timing there :) W każdym razie, sprawdź podobne pytanie, jeśli potrzebujesz pomocy przy testowaniu ciągów znaków z unikodami. – KobeJohn

Odpowiedz

66

Regex powinien być szybki dojazd:

re.search('[a-zA-Z]', the_string) 
+1

Dziękuję JBernado, właśnie to zrobiłem i działa bezbłędnie za to, co muszę zrobić. –

+4

@JustinPapez powinieneś przyjąć tę odpowiedź wtedy ... – sadmicrowave

+0

Ups, całkowicie zapomniałem, dziękuję za przypomnienie. –

49

Jak o:

>>> string_1 = "(555).555-5555" 
>>> string_2 = "(555) 555 - 5555 ext. 5555" 
>>> any(c.isalpha() for c in string_1) 
False 
>>> any(c.isalpha() for c in string_2) 
True 
+0

Czy "set (string_1)" będzie bardziej wydajny? –

+1

@Rik. Masz na myśli konwersję string_1 do zestawu przed testowaniem? Nie, nie będzie bardziej efektywny. To jest gwarantowane, że radzisz sobie ze wszystkimi postaciami co najmniej raz, podczas gdy uważam, że każda funkcja będzie zwierać (zatrzymywać), gdy napotka pierwszą fałszywą. – KobeJohn

+0

Kod ten będzie nieco powolny, ponieważ wymaga wywołania funkcji na znak. Przekształcenie w 'set' może, ale nie musi, zredukować liczbę wywołań funkcji, ale dodaje trochę narzutów. – JBernardo

8

Można użyć wyrażenia regularnego tak:

import re 

print re.search('[a-zA-Z]+',string) 
9

Można użyć islower() na ciąg aby zobaczyć, czy zawiera małe litery (pośród innych znaków). or to z isupper() również sprawdzić, czy zawiera jakieś wielkie litery:

poniżej: litery w ciągu: plony testowych prawdziwych

>>> z = "(555) 555 - 5555 ext. 5555" 
>>> z.isupper() or z.islower() 
True 

poniżej: brak litery w ciągu: plony testów fałszywie.

>>> z= "(555).555-5555" 
>>> z.isupper() or z.islower() 
False 
>>> 

Nie należy mylić z isalpha() która zwraca True tylko wtedy, gdy wszystkie znaki to litery, które nie jest tym, co chcesz.

Zauważ, że odpowiedź Barma jest ładnie moja, ponieważ moja nie radzi sobie dobrze z przypadkiem mieszanym.

+1

Podoba mi się, że to sprawdzi, czy zawiera ZAWARTOŚĆ liter, a nie tylko sprawdzenie, czy dane wejściowe są WSZYSTKIMI literami: – Cornbeetle

+0

@Cornbeetle tak, ten rodzaj naprawdę odpowiada pytanie po tych wszystkich latach, dzięki –

2

Podobała mi się odpowiedź udzielona przez @ jean-françois-fabre, ale jest niekompletna.
Jego podejście będzie działać, ale tylko wtedy, gdy tekst zawiera wyłącznie niższy lub wielkich liter:

>>> text = "(555).555-5555 extA. 5555" 
>>> text.islower() 
False 
>>> text.isupper() 
False 

Lepszym rozwiązaniem jest pierwszym górnym lub małe litery swój ciąg, a następnie sprawdzić.

>>> string1 = "(555).555-5555 extA. 5555" 
>>> string2 = '555 (234) - 123.32 21' 

>>> string1.upper().isupper() 
True 
>>> string2.upper().isupper() 
False 
Powiązane problemy