正则表达式:如果倒数第二个字符是大写,是否截断最后一个字符?

1 投票
4 回答
1467 浏览
提问于 2025-04-17 08:28

我想要把字符串最后一个字符去掉,前提是这个字符是小写字母,并且倒数第二个字符是大写字母。比如说。

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

我该怎么写正则表达式呢?我在想用 r"(.+?)" 这样的写法,但不太确定怎么在最后部分做条件判断。这个字符串里面可能还会有像 ()-,+ 这样的符号。

谢谢!

4 个回答

1

这是我用正则表达式来实现的方法。

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

这样就得到了

14-ME
MEA
MEA
mama

我不太确定你是否想要匹配字符串的结尾,但我的正则表达式就是这么做的。

1

试试这个表达式 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

对于那些匹配的对象,你可以用 .group 方法提取出除了最后一个字符以外的所有字符:

a = re.match(regex,'MEAm')
a.group(1) # 'MEA'
2

其实你不需要用正则表达式来解决这个问题,写一段简单的代码就可以了。

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

或者如果你不想处理异常的情况……

def chop_char(s):
    if len(s) > 1:
        if s[-2].istitle() and not s[-1].istitle():
            return s[:-1]
    return s

撰写回答