使用python中的re.sub使字母大写?

时间:2012-01-19 22:44:12

标签: python regex

在许多编程语言中,以下

找到foo([a-z]+)bar并替换为GOO\U\1GAR

将导致整个匹配变为大写。我似乎无法找到python中的等价物;它存在吗?

5 个答案:

答案 0 :(得分:33)

你可以将一个函数传递给re.sub(),这样你就可以做到这一点,这是一个例子:

 def upper_repl(match):
     return 'GOO' + match.group(1).upper() + 'GAR'

使用它的一个例子:

 >>> re.sub(r'foo([a-z]+)bar', upper_repl, 'foobazbar')
 'GOOBAZGAR'

答案 1 :(得分:8)

你的意思是这样吗?

>>>x = "foo spam bar"
>>>re.sub(r'foo ([a-z]+) bar', lambda match: r'foo {} bar'.format(match.group(1).upper()), x)
'foo SPAM bar'

作为参考,这里是re.sub的文件串(强调我的)。

  

返回通过替换最左边获得的字符串   由字符串中的模式非重叠出现   替换代表repl可以是字符串或可调用;   如果处理了一个字符串,则反斜杠转义。 如果是的话   一个可调用的,它传递了匹配对象并且必须返回   要使用的替换字符串。

答案 2 :(得分:3)

你可以使用以下的一些变体:

s = 'foohellobar'
def replfunc(m):
     return m.groups()[0]+m.groups()[1].upper()+m.groups()[2]
re.sub('(foo)([a-z]+)(bar)',replfunc,s)

给出输出:

'fooHELLObar'

答案 3 :(得分:2)

如果您已经有一个替换字符串(模板),您可能不会热衷于将其更换为m.group(1)+...+m.group(2)+...+m.group(3)的详细信息......有时候,整齐的小字符串会很好。< / p>

您可以使用MatchObject expand()功能以与sub()相同的方式评估匹配模板,从而可以保留原始版本模板尽可能。您可以在相关部分上使用upper

re.sub(r'foo([a-z]+)bar', lambda m: 'GOO' + m.expand('\1GAR').upper())

虽然这在上面的示例中不是特别有用,虽然它不会对复杂情况有所帮助,但对于具有更多捕获组的更长表达式可能更方便,例如MAC地址检查正则表达式,其中你只是想确保完全替换是否大写。

答案 4 :(得分:1)

对于那些在谷歌上发现的人......

您还可以使用re.sub匹配重复模式。例如,您可以将带空格的字符串转换为camelCase:

def to_camelcase(string):
  string = string[0].lower() + string[1:]  # lowercase first
  return re.sub(
    r'[\s]+(?P<first>[a-z])',              # match spaces followed by \w
    lambda m: m.group('first').upper(),    # get following \w and upper()
    string) 

to_camelcase('String to convert')          # --> stringToConvert
相关问题