pythonregexignore-case

How to set ignorecase flag for part of regular expression in Python?


Is it possible to implement in Python something like this simple one:

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

Letters of token in the middle of string are always capital. Letters of the rest of words can have any case (USE, use, Use, CODE, code, Code and so on)


Solution

  • As far as I could find, the python regular expression engine does not support partial ignore-case. Here is a solution using a case-insensitive regular expression, which then tests if the token is uppercase afterward.

    #! /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)
    

    Here is the program's output:

    Use HELLO1 code -> HELLO1
    USE hello1 CODE -> None
    this does not match -> None