Как установить флаг игнорирования для части регулярного выражения в Python? - PullRequest
3 голосов
/ 21 сентября 2009

Возможно ли реализовать в Python что-то вроде этого простого:

#!/usr/bin/perl
my $a = 'Use HELLO1 code';
if($a =~ /(?i:use)\s+([A-Z0-9]+)\s+(?i:code)/){
    print "$1\n";
}

Буквы токена в середине строки всегда являются заглавными. Буквы остальных слов могут иметь любой регистр (ИСПОЛЬЗОВАНИЕ, использование, использование, КОД, код, код и т. Д.)

Ответы [ 3 ]

10 голосов
/ 21 сентября 2009

Насколько я мог найти, механизм регулярных выражений python не поддерживает частичный регистр игнорирования. Вот решение, использующее регистрозависимое регулярное выражение, которое затем проверяет, является ли токен заглавным после.

#! /usr/bin/env python

import re

token_re = re.compile(r'use\s+([a-z0-9]+)\s+code', re.IGNORECASE)
def find_token(s):
    m = token_re.search(s)
    if m is not None:
        token = m.group(1)
        if token.isupper():
            return token

if __name__ == '__main__':
    for s in ['Use HELLO1 code',
              'USE hello1 CODE',
              'this does not match',
             ]:
        print s, '->',
        print find_token(s)

Вот вывод программы:

Use HELLO1 code -> HELLO1
USE hello1 CODE -> None
this does not match -> None
3 голосов
/ 05 сентября 2017

Начиная с Python 3.6, вы можете использовать флаг внутри групп:

(imsx-imsx: ...)

(Ноль или более букв из набора «i», «m», «s», «x», за которыми следует «-», за которыми следуют одна или несколько букв из того же набора.) соответствующие флаги: re.I (игнорировать регистр), re.M (многострочный), re.S (точка соответствует всем) и re.X (подробный) для части выражения.

Таким образом, (?i:use) теперь является правильным синтаксисом. С терминала python3.6:

>>> import re
>>> regex = re.compile('(?i:use)\s+([A-Z0-9]+)\s+(?i:code)')
>>> regex.match('Use HELLO1 code')
<_sre.SRE_Match object; span=(0, 15), match='Use HELLO1 code'>
>>> regex.match('use HELLO1 Code')
<_sre.SRE_Match object; span=(0, 15), match='use HELLO1 Code'>
3 голосов
/ 21 сентября 2009

Согласно документации , это невозможно. Синтаксис (?x) позволяет изменять только флаг для всего выражения. Следовательно, вы должны разделить это на три регулярных выражения и применить их один за другим или , выполнив «регистр игнорирования» вручную: /[uU][sS][eE]...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...