2016-04-11 4 views
1

Я сосать в регулярном выражении Python и хотел бы увидеть некоторые решенные примеры, чтобы помочь мне получить понимание. Я экспериментирую с использованием http://pyregex.com/, который является большим, но для этого мне нужны некоторые «хорошие» примеры.Примеры регулярных выражений Python

Я пытаюсь создать набор правил, например, так:

rules = [('name', r'[a-z]+'), 
     ('operator', r'[+-*\]'] 

, которые у меня есть found, но не достаточно уверенно, чтобы создать свои собственные регулярные выражения для случаев, таких как те, что перечислены ниже:

  1. матч только = или += или *=
  2. соответствуют знаку + (то есть operator, как показано выше). tely из ++ символов
  3. соответствует любому слову после определенного ключевого слова (например. int) и любое количество пробелов и/или вкладок. [Редактировать - первоначально следовал который был неправ]

Для 1. Я попытался [\+=|=], на 2. Я знаю, что порядок в правилах важно и 3. Я полностью потерял с [] и о том, как Я могу обобщить этот случай для работы не только для int, но и для float.

Любые примеры кода будут очень благодарны, так как я только начинаю с Python и кодирования!

+2

1) 'r '[+ *]? ='', 2) 'r '(?

+1

[Первый] (https://regex101.com/r/oC4tX2/1), [второй] (https://regex101.com/r/oC4tX2/2) и [третий] (https://regex101.com/r/oC4tX2/3). – Jan

+0

Вы не предоставляете достаточно информации. Нужны примеры использования, а не отдельные отдельные части. Я предполагаю, что фактическое использование намного сложнее. – sln

ответ

2

матч только = или + = или * = символы

r'[+*]?=' 

[+*]?= состоит из необязательного атома, класс [+*] символ, который соответствует либо + или *, ? - один или нулевое время, и буква =. Почему не r'\+=|\*=|='? Не только дополнительное решение класса символов короче, но и оно более эффективно: при использовании чередования вы всегда имеете более избыточный откат. Вы также должны быть внимательны, чтобы поместить альтернативы в правильном порядке, так что самый длинный появится первым (хотя это не всегда гарантирует, что самый длинный будет соответствовать (зависит от подшаблонов ветви), или порядок не имеет значения, если есть анкеры на обеих сторонах группы чередования).

соответствует символу + (i.е оператор, как показано выше) отдельно от персонажей ++

r'(?<!\+)\+(?!\+)' 

Эта модель соответствует литералу + (как это избежали), и только в случае, если он не является ни предшествует другой плюс (см отрицательного просмотра назад (?<!\+)), а также другой плюс (см. Позитивный взгляд (?!\+)). Описания не являются потребляющими, т. Е. Индекс регулярных выражений остается прямо перед плюсом, когда он проверяет наличие плюса перед ним и после плюса, когда он проверяет наличие плюса после него. Символы (или начало/конец строковых позиций) не возвращаются как часть совпадения (именно поэтому их называют нулевой шириной, не захватывающих узоров).

соответствует любому слову после определенного ключевого слова (например, int) и любого количества пробелов и/или вкладок.

r'\bint\b(?=\s+\w+\s+)' 

Если вы читали объяснение выше, вы распознаете другое нулевую ширину утверждения здесь: (?=\s+\w+\s+) является положительным опережением, который проверяет, является ли целым словом int (как \b матчей слова граничных позиций) следует с 1 + пробелы, затем 1 + слова, а затем снова 1 + пробелы.

+0

Отличный материал, спасибо за ваше время, объясняя их так ясно. Один маленький вопрос: для первого, я понимаю вашу точку зрения об эффективности, есть ли способ убедиться, что такие случаи, как '+++++ =', не совпадают? – Karim

+1

@Karim: Это зависит от того, что такое вход. Возможно, проще всего будет требовать, чтобы пробелы находились по обе стороны от выражения: ['(?

+0

Отличное объяснение .. + 1. –

0

Примеры, приведенные в документации и в предыдущих ответах, помогут вам начать работу по правильному пути. Дополнительное соображение, поскольку вы сказали, что вы новичок в программировании и Python, заключается в том, что регулярные выражения являются промежуточными до передовой темам (в зависимости от того, что вы хотите с этим делать), и их следует решать, как только вы лучше поймете хорошие методы программирования и основы Python. В любом случае более подробную информацию и примеры можно найти по адресу: Python Regular Expressions module.

Смежные вопросы