2009-09-21 5 views
2

possible de mettre en œuvre quelque chose comme ceci Python simple:Comment faire pour définir l'indicateur ignorecase pour une partie de l'expression régulière en Python? Est-il

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

lettres de jeton au milieu de la chaîne sont toujours capital. Les lettres du reste des mots peuvent avoir n'importe quel cas (UTILISATION, utilisation, utilisation, CODE, code, code et ainsi de suite)

Répondre

9

Pour autant que je pouvais trouver, le moteur d'expression régulière python ne supporte pas ignore- partiel Cas. Voici une solution utilisant une expression régulière insensible à la casse, qui teste ensuite si le jeton est en majuscule par la suite.

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

Voici la sortie du programme:

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

'match' n'est clairement pas la bonne méthode - et si vous passez à' search', puisque vous ne cherchez pas "next possible candidate", votre 'find_token' donnera de faux négatifs (si une instance de "bon sauf cas" précède celle de "bon cas"). –

+0

@Alex Martelli: Merci. La recherche est meilleure, vous avez raison. Fixé. –

3

According to the docs, ce n'est pas possible. La syntaxe (?x) vous permet uniquement de modifier un indicateur pour l'expression entière. Par conséquent, vous devez diviser cela en trois regexp et les appliquer l'un après l'autre ou ne le « ignorer la casse » manuellement: /[uU][sS][eE]...

+0

Je vois, thx. l'espoir meurt en dernier :) –

1

Depuis python 3.6, vous pouvez utiliser le drapeau à l'intérieur des groupes:

(? Imsx-imsx ...)

(Zéro ou plusieurs lettres de l'ensemble 'i', 'm', 's', 'x', suivi éventuellement de '-' suivi d'une ou de plusieurs lettres du même ensemble.) Les lettres placent ou suppriment les lettres ags: re.I (ignorez le casse), re.M (multiligne), re.S (point correspond à tout), et re.X (verbose), pour la partie de l'expression.

Donc (?i:use) est maintenant une syntaxe correcte. A partir d'un terminal 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'> 
Questions connexes