Je veux couper le dernier caractère s'il est en minuscules et l'avant-dernier en majuscules. Par exemple.

14-ME -> 14-ME
MEA  -> MEA
MEAm -> MEA  #like this one
mama -> mama

Comment écrire le regx? Je pense à quelque chose comme r "(. +?)" Mais je ne sais pas comment faire une chose conditionnelle sur la dernière partie. Le mot pourrait avoir quelque chose comme () -, + aussi.

Merci

1
Tg. 16 déc. 2011 à 08:51

4 réponses

Meilleure réponse

Vous n'avez pas vraiment besoin d'une expression régulière pour le faire lorsque vous pouvez écrire un simple morceau de code pour le faire.

def chop_char(some_string):
    try:
        # determine if the second to last character is upper case
        if some_string[-2].istitle() and not some_string[-1].istitle():
            return some_string[:-1] # slice off the last character
    except IndexError:
        # string isn't long enough to have a 2nd to last char (i.e. it's only 1 character)
        pass
    return some_string

Ou si vous ne voulez pas les trucs d'exception ...

def chop_char(s):
    if len(s) > 1:
        if s[-2].istitle() and not s[-1].istitle():
            return s[:-1]
    return s
2
wkl 16 déc. 2011 à 04:58

Essayez r"(.+[A-Z])[a-z]\b".

import re
regex = r"(.+[A-Z])[a-z]\b"

re.match(regex,'14-ME') # None
re.match(regex,'MEA') # None
re.match(regex,'MEAm') # <_sre.SRE_Match object at 0x.. >
re.match(regex,'mama') # None

Pour les objets qui correspondent, vous pouvez récupérer tout sauf le dernier caractère en utilisant .group:

a = re.match(regex,'MEAm')
a.group(1) # 'MEA'
1
mathematical.coffee 16 déc. 2011 à 05:02

Voici comment je le ferais avec une expression rationnelle.

strings = ["14-ME","MEA","MEAm","mama"]
p = re.compile(r"([A-Z])[a-z]$")
for s in strings:
    print p.sub(r"\1", s)

Qui donne

14-ME
MEA
MEA
mama

Il n'était pas clair pour moi si vous vouliez qu'elle corresponde à la fin de la chaîne, mais c'est ce que fait mon expression rationnelle.

1
Justin Peel 16 déc. 2011 à 05:43

Je ne sais rien de l'expression rationnelle de python (ou de toute expression rationnelle vraiment), mais vous voulez probablement que quelque chose corresponde comme: [liste de lettres majuscules] [liste de lettres minuscules] [fin de mot]

0
Daniel 16 déc. 2011 à 04:53
8529916