2013-04-11 11 views
8

Sprawdzam poprawność wprowadzania tekstu przez użytkownika, aby akceptował tylko litery, ale nie liczby. do tej pory mój kod działa poprawnie po wpisaniu liczby (na przykład 56), ostrzega mnie, że powinienem tylko wpisywać litery, a kiedy wpisuję litery, nic nie zwraca (tak jak powinno). Mój problem polega na tym, że akceptuje go, gdy zaczynam od wpisywania liter, a następnie liczb, np. (s45). to, co robi, to akceptuje pierwszą literę, ale nie cały ciąg. Potrzebuję go, aby zaakceptować cały ciąg.Python - jak używać re do dopasowywania całego ciągu znaków

def letterCheck(aString): 
    if len(aString) > 0: 
     if re.match("[a-zA-Z]", aString) != None: 
      return "" 
    return "Enter letters only" 
+0

Cóż trzeba zwrócić pusty i spróbuj dodać '+' na końcu wyrażenia regularnego. – squiguy

+0

Nie, część powrotna jest w porządku. jego celem jest nic nie zwrócić, jeśli przejdzie test sprawdzający. – Thomas

+2

Dlaczego nie używasz 'aString.isalpha()'? – kindall

Odpowiedz

31

Kotwica to na początku i na końcu, a mecz jeden lub więcej znaków:

if re.match("^[a-zA-Z]+$", aString): 

Tutaj zakotwicza na początku ciągu, $ do końca i + zapewnia dopasowanie 1 lub więcej znaków.

Zamiast tego lepiej jest po prostu użyć str.isalpha(). Nie trzeba sięgać po mocny wyskakujący wyraz tutaj:

>>> 'foobar'.isalpha() 
True 
>>> 'foobar42'.isalpha() 
False 
>>> ''.isalpha() 
False 
+3

Czy potrzebujesz tego: '^' with re.match? Czy to nie jest dorozumiane? – Medorator

+2

@buffer: tak, jest dorozumiana; Wolę jednak wyraźną kotwicę, ponieważ absolutnie potrzebujesz '$', a zbyt wiele osób potyka się o różnicę między 're.search()' i 're.match()'. –

+0

@MartijnPieters: To dobra sugestia. Nie mogłem wywnioskować z dokumentacji, czy może wystąpić jakikolwiek efekt uboczny umieszczenia '^' z 're.match' – Medorator

4

użytku granice twojej regex + surowego ciąg do zakodowania regex, tak:

r"^[a-zA-Z]+$" 
3

Możesz rozważyć użycie isalpha() w ciągu znaków. Zwraca wartość true, jeśli łańcuch zawiera tylko znaki alfabetyczne, w przeciwnym razie false.

if aString.isalpha(): 
    do something 
else: 
    handle input error 
+0

Jedną z ładnych właściwości 'isalpha()' dla tej aplikacji jest to, że zwraca 'False' dla pustych ciągów, więc oddzielny test dla tego nie jest już potrzebny. – kindall

+0

dziękuję wszystkim za szybkie odpowiedzi, wszystkie pomogły mi rozwiązać ten problem. – Thomas

0

jeśli spojrzeć na dość pythonic pism, przejdź do isalpha i isdecimal:

str = u"23443434"; 
print str.isdecimal(); 
Powiązane problemy