tags:

views:

150

answers:

2

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)

+1  A: 

According to the docs, this is not possible. The (?x) syntax only allows you to modify a flag for the whole expression. Therefore, you must split this into three regexp and apply them one after the other or do the "ignore case" manually: /[uU][sS][eE]...

Aaron Digulla
i see, thx. hope dies last :)
Dmitry Nedbaylo
+5  A: 

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
Christian Oudard
`match` clearly isn't the right method -- and if you switch to `search`, since you don't loop looking for "next possible candidate", your `find_token` will give false negatives (if an instance of "good except for case" precedes one of "good including case").
Alex Martelli
@Alex Martelli: Thanks. Search is better, you're right. Fixed.
Christian Oudard