Как использовать регулярное выражение для соответствия имени?

Я новичок в Python. Я хочу написать регулярное выражение для проверки имени. Моя строка ввода может содержать az, AZ, 0-9 и '_', но она должна начинаться с az или AZ (не 0-9 и '_'). Я хочу написать для этого регулярное выражение. Я пробовал, но ничего не было идеально.

Как только строка ввода будет следовать правилам регулярных выражений, я могу продолжить дальше, в противном случае отбросить эту строку.

 >>> 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") >>> 

Примечание : указанная string cannot start from ( 0-9 and "_"). OP string cannot start from ( 0-9 and "_"). , по-видимому, может быть в тексте. Вот почему я использую \w

Примечание2 . Если вы не хотите, чтобы строка соответствия заканчивалась с \n , вы могли бы использовать \Z вместо $ как упоминал Джон Махин.

Вот ответ на ваш вопрос:

Интерпретируя, что вы хотите _ (не - ), это должно выполнить эту работу:

 >>> 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 >>> 

Настойчиво сопротивляйтесь искушению использовать $ ; вот почему:

Привет, привет, используя $ is WRONG, вместо этого используйте \Z

 >>> 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 

В «Прекрасном руководстве» говорится:

'$'
Соответствует концу строки или непосредственно перед новой строкой в ​​конце строки [мой акцент], а в режиме MULTILINE также соответствует перед новой строкой . foo соответствует как «foo», так и «foobar», в то время как регулярное выражение foo $ соответствует только «foo». Более интересно, поиск foo. $ В 'foo1 \ nfoo2 \ n' соответствует 'foo2' обычно, но 'foo1' в режиме MULTILINE; поиск одного $ в 'foo \ n' найдет два (пустых) совпадения: один перед символом новой строки и один в конце строки.

а также

\ Z
Совпадает только в конце строки.

=== И теперь для чего-то совершенно другого ===

 >>> 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 >>> 

здесь нет повтора

 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