Регулярное выражение для подтверждения того, является ли строка допустимым идентификатором в Python

У меня есть следующее определение для идентификатора:

Identifier --> letter{ letter| digit} 

В основном у меня есть функция идентификатора, которая получает строку из файла и проверяет ее, чтобы убедиться, что она является допустимым идентификатором, как определено выше.

Я пробовал это:

 if re.match('\w+(\w\d)?', i): return True else: return False 

но когда я запускаю свою программу каждый раз, когда она встречает целое число, она думает, что это действительный идентификатор.

Например

 c = 0 ; 

он печатает c как действительный идентификатор, который является точным, но также выводит 0 как действительный идентификатор.

Что я здесь делаю неправильно?

3 Solutions collect form web for “Регулярное выражение для подтверждения того, является ли строка допустимым идентификатором в Python”

Из официальной ссылки : identifier ::= (letter|"_") (letter | digit | "_")*

Таким образом, регулярное выражение:

 ^[^\d\W]\w*\Z 

Пример (для Python 2 просто опустите re.UNICODE ):

 import re identifier = re.compile(r"^[^\d\W]\w*\Z", re.UNICODE) tests = [ "a", "a1", "_a1", "1a", "aa$%@%", "aa bb", "aa_bb", "aa\n" ] for test in tests: result = re.match(identifier, test) print "%s\t= %s" % (test, (result is not None)) 

Результат:

  a = True a1 = True _a1 = True 1a = False aa$%@% = False aa bb = False aa_bb = True aa = False 

Для Python 3 вам нужно обрабатывать буквы и цифры Unicode. Поэтому, если это вызывает беспокойство, вы должны ладить с этим:

 re_ident = re.compile(r"^[^\d\W]\w*$", re.UNICODE) 

[^\d\W] соответствует символу, который не является цифрой, а не «не буквенно-цифровым», что означает «символ, который является буквой или подчеркиванием».

\ w соответствует цифрам и символам. Попробуйте ^[_a-zA-Z]\w*$

  • Сократить «для циклов для больших данных» и улучшить
  • Декодирование вложенного JSON с несколькими циклами for
  • python: если запись не является приемлемым параметром для подсказки, как запросить
  • Существует ли необходимость в диапазоне (len (a))?
  • Инициализация Python через атрибуты объекта
  • Как я могу суммировать столбец списка?
  • Изменяйте каждый цикл for в цикле функции, чтобы обработка ошибок выполнялась автоматически после каждой неудачной итерации
  • Получение следующей переменной в цикле for
  • Python - лучший язык программирования в мире.