2016-01-10 5 views
2

Я пытаюсь создать регулярное выражение python для представления идентификаторов для лексического анализатора. Мой подход:Python Regex for alpha (alpha | digit) *

([a-zA-Z]([a-zA-Z]|\d)*) 

Когда я использую это:

regex = re.compile("\s*([a-zA-Z]([a-zA-Z]|\d)*)") 
regex.findall(line) 

Он не производит список идентификаторов, как это должно быть. Я неправильно сформулировал это выражение?

Что такое хороший способ представить форму:

alpha(alpha|digit)* 

С модулем питона повторно?

+0

Ваше регулярное выражение прекрасно, но некоторые советы: вы должны прикрепить строку регулярного выражения к 'r', чтобы сделать его строковым литералом. Кроме того, вам не следует использовать группы захвата, если это необходимо, если вам нужно использовать брекетинг, просто используйте синтаксис '(?: ...)'. –

+0

попробуйте [regex101] (https://regex101.com/#python) – miraculixx

ответ

1

так:

regex = re.compile(r'[a-zA-Z][a-zA-Z\d]*') 

Обратите внимание на г до цитаты, чтобы получить сырую строку, в противном случае вам нужно бежать все обратные косые черты.

Поскольку \s* не является обязательным, его можно удалить, как группы захвата.

Если вы хотите, чтобы убедиться, что матч не предшествует цифра, то вы можете написать это с отрицательным (?<!...): 'назад

regex = re.compile(r'(?:^|(?<![\da-zA-Z]))[a-zA-Z][a-zA-Z\d]*') 

Следует отметить, что с re.compile вы можете использовать параметры регистрозависимости :

regex = re.compile(r'(?:^|(?<![\da-z]))[a-z][a-z\d]*', re.I)