Gå til innhold

Sjekke for bokstaver med mellomrom?


Anbefalte innlegg

Hei,

 

Holder på å lage en liten applikasjon hvor bruker skal skrive inn navn via raw_input. Sjekker så input for bokstaver slik:

if new_name.isalpha(): 
    break
else:
    print "ups, letters please!"

dette fungerer ypperlig med ett navn, men om man har dobbelt navn som "Ola Nordman" vil den skrive "ups, letters please!" pga mellomrommet. Hvordan unngår jeg dette?

 

takker :)

Lenke til kommentar
Videoannonse
Annonse

Regex er ok,alternative uten regex kan være noe som dette.

>>> name = 'Ola Nordmann'
>>> if all(x.isalpha() or x.isspace() for x in name):
...     print 'True'
...     
True
>>> name = 'Ola Nordmann9'
>>> if all(x.isalpha() or x.isspace() for x in name):
...     print 'True'
...     
>>> 
  • Liker 1
Lenke til kommentar
  • 2 måneder senere...
Hvis f.eks. jeg har André som mellomnavn eller 慧 som japansk navn, får jeg være med på moroa?

Viss jeg tar høyde for det så får du nok det,skjønner jo godt hva du vil fram til.

Dette er jo noe noe man bør kjenne til viss man programmer litt.

Det er forskjellige løsninger i forskjellige språk,kan ta litt med Python.

 

Her blir det feil.

Gjelder Python 2.

>>> name = 'André'
>>> print name
André
>>> name.isalpha()
 False 

Behandle input som Unicode.

Gjelder Python 2.

>>> name = u'André'
>>> print name
André
>>> name.isalpha()
True 

>>> name_jap = u'慧'
>>> print name_jap
慧
>>> name.isalpha()
True

I Python 3 er alle strenger en sekvenser av Unicode-tegn.

Dette var en av de store forandring i Python 3.

>>> name = 'André'
>>> print(name)
André
>>> name.isalpha()
True

For regex må man ha med re.UNICODE.

Endret av snippsat
  • Liker 1
Lenke til kommentar
Hvordan ser det regulære uttrykket som matcher alle gyldige navnetegn i dette tilfellet?

Det er problem med unicode og originale re module.

Det finnes en ny regex module som tar høyde for unicode i regex.

Kan se litt på hvordan dette fungerer.

 

Som forventet så finner vi ikke "é"

[a-zA-Z] finner bare ASCII tekst og ikke unicode tekst.

Det samme som [a-zA-Z] i regex(unicode) er [\p{Lu}\p{Ll}].

Men den originale re module støtter ikke \p{} syntak.

>>> import re 
>>> name = u'André'
>>> print repr(name)
u'Andr\xe9'
>>> print ''.join(re.findall(ur'[a-zA-Z]', name, re.UNICODE))
Andr

Test av alternative regex module.

Her ser vi at \p{} syntak fungerer som den skal.

>>> import regex #New import not re
>>> name = u'André'
>>> print repr(name)
u'Andr\xe9'
>>> print ''.join(regex.findall(ur"[\p{Lu}\p{Ll}]", name))
André

Her en tøff test med mix av unicode bokstaver og mellomrom som det var med i TS spørsmål.

>>> import regex 
>>> name = u'André 慧 øæå'
>>> print repr(name)
u'Andr\xe9 慧 \xf8\xe6\xe5'
>>> print ''.join(regex.findall(ur"[\p{L}\p{White_Space}]", name))
André 慧 øæå

Ser her at \p{L} matcher alle Unicode-tegn og ASCII-tegn,

og \p{White_Space} matcher mellomrom.

Fungerer som det skal med den nye regex module.

Endret av snippsat
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...