2010-02-23 5 views
5

Je suis un débutant en Python. Je veux écrire une expression régulière pour une vérification de nom. Ma chaîne d'entrée peut contenir a-z, A-Z, 0-9 et '_', mais elle doit commencer par a-z ou A-Z (pas 0-9 et '_'). Je veux écrire une expression régulière pour cela. J'ai essayé, mais rien ne correspondait parfaitement.Comment utiliser une expression régulière pour faire correspondre un nom?

Une fois que la chaîne d'entrée suit les règles d'expression régulière, je peux aller plus loin, sinon rejeter cette chaîne.

+0

est la chaîne vide à laisser? – Svante

+1

Lequel est-il maintenant, '-' ou' _'? – Svante

+0

La chaîne vide ne peut pas être autorisée. "_" ceci est hypen pas dash – user279315

Répondre

4
>>> import re 

>>> re.match("[a-zA-Z][\w-]*$","A") 
<_sre.SRE_Match object at 0x00932E20> 

>>> re.match("[a-zA-Z][\w-]*$","A_B") 
<_sre.SRE_Match object at 0x008CA950> 

>>> re.match("[a-zA-Z][\w-]*$","0A") 
>>> 
>>> re.match("[a-zA-Z][\w-]*$","!A_B") 
>>> 

Remarque: OP mentionné string cannot start from (0-9 and "_")., apparemment _ peut être dans le texte. C'est pourquoi j'utilise \w

Note2: Si vous ne voulez pas chaîne de correspondance se termine par \n, vous pouvez utiliser \Z au lieu de $ comme John Machin mentionné.

+0

'[a-zA-Z] [\ w -] * $' Cette regex est erronée car elle correspond à une chaîne commençant par n'importe quoi. Presque là cependant, juste besoin d'un circonflexe au début. – Mikuso

+2

@Mikuso, 're.match()' correspond uniquement au début de la chaîne. 're.search() 'aurait besoin du signe d'insertion –

+0

Wrong; cela correspond à "A \ n" –

5

est ici une réponse à votre question:

interprétation que vous voulez _ (non -), cela devrait faire le travail:

>>> tests = ["a", "A", "a1", "a_1", "1a", "_a", "a\n", "", "z_"] 
>>> for test in tests: 
... print repr(test), bool(re.match(r"[A-Za-z]\w*\Z", test)) 
... 
'a' True 
'A' True 
'a1' True 
'a_1' True 
'1a' False 
'_a' False 
'a\n' False 
'' False 
'z_' True 
>>> 

résister vaillamment à la tentation d'utiliser $; voici pourquoi:

Bonjour, bonjour, utilise $ est MAUVAIS, utilisez \Z à la place

>>> re.match(r"[a-zA-Z][\w-]*$","A") 
<_sre.SRE_Match object at 0x00BAFE90> 
>>> re.match(r"[a-zA-Z][\w-]*$","A\n") 
<_sre.SRE_Match object at 0x00BAFF70> # WRONG; SHOULDN'T MATCH 
>>> 

>>> re.match(r"[a-zA-Z][\w-]*\Z","A") 
<_sre.SRE_Match object at 0x00BAFE90> 
>>> re.match(r"[a-zA-Z][\w-]*\Z","A\n") 
>>> # CORRECT: NO MATCH 

The Fine Manual dit:

'$'
correspond à la fin de la chaîne ou juste avant la nouvelle ligne à la fin de la chaîne [mon accentuation], et en mode MULTILINE correspond également avant une nouvelle ligne. foo correspond à la fois à 'foo' et 'foobar', tandis que l'expression régulière foo $ ne correspond qu'à 'foo'. Plus intéressant, la recherche de foo. $ Dans 'foo1 \ nfoo2 \ n' correspond normalement à 'foo2', mais 'foo1' en mode MULTILINE; rechercher un seul $ dans 'foo \ n' trouvera deux correspondances (vides): une juste avant le retour à la ligne, et une à la fin de la chaîne.

et

\ Z
Matches seulement à la fin de la chaîne.

=== Et maintenant quelque chose de complètement différent ===

>>> import string 
>>> letters = set(string.ascii_letters) 
>>> ok_chars = letters | set(string.digits + "_") 
>>> 
>>> def is_valid_name(strg): 
...  return strg and strg[0] in letters and all(c in ok_chars for c in strg) 
... 
>>> for test in tests: 
...  print repr(test), repr(is_valid_name(test)) 
... 
'a' True 
'A' True 
'a1' True 
'a_1' True 
'1a' False 
'_a' False 
'a\n' False 
'' '' 
'z_' True 
>>> 
-1

ici est une façon non re

import string 
flag=0 
mystring="abcadsf123" 
if not mystring[0] in string.digits+"_": 
    for c in mystring: 
     if not c in string.letters+string.digits+"-": 
      flag=1 
    if flag: print "%s not ok" % mystring 
    else: print "%s ok" % mystring 
else: print "%s starts with digits or _" % mystring 
+0

(1) Le questionneur n'a pas dit qu'il voulait des résultats dépendants des paramètres régionaux; il a dit qu'il voulait [a-zA-Z], donc utilisez string.ascii_letters (2) se bloque si l'entrée est "" (3) la chose du drapeau est horrible –

Questions connexes