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

在python中使用re.sub使字母大写?,python,regex,Python,Regex,在许多编程语言中,以下命令 找到foo([a-z]+)条并替换为GOO\U\1GAR 将导致整个匹配以大写形式进行。我在python中似乎找不到对应的代码;它存在吗?您可以使用它的一些变体: s = 'foohellobar' def replfunc(m): return m.groups()[0]+m.groups()[1].upper()+m.groups()[2] re.sub('(foo)([a-z]+)(bar)',replfunc,s) 给出输出: 'fooHELLOb

在许多编程语言中,以下命令

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


将导致整个匹配以大写形式进行。我在python中似乎找不到对应的代码;它存在吗?

您可以使用它的一些变体:

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'

您可以向传递一个函数,该函数将允许您执行此操作,以下是一个示例:

 def upper_repl(match):
     return 'GOO' + match.group(1).upper() + 'GAR'
以及一个使用它的示例:

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

你是说像这样的事吗

>>>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
(emphasis mine)的文档字符串供参考

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


如果您已经有了一个替换字符串(模板),那么您可能不想用
m.group(1)+…+m.group(2)+…+m.group(3)
的冗长内容来替换它。。。有时候有一根整齐的小绳子是很好的

您可以使用
MatchObject
函数以与相同的方式评估匹配模板,从而尽可能保留原始模板。您可以在相关部件上使用
upper

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

虽然这在上面的示例中不是特别有用,而且在复杂的情况下也没有帮助,但对于捕获组数量更多的较长表达式,例如MAC地址审查正则表达式,可能更方便,您只想确保全部替换内容是否大写。

对于那些在谷歌上遇到此问题的人

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

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
def to_camelcase(字符串):
string=字符串[0]。lower()+字符串[1:]#先小写
返回有关(
r'[\s]+(?P[a-z]),#匹配空格,后跟\w
lambda m:m.group('first').upper(),#获取以下内容\w和upper()
(字符串)
to_camelcase('String to convert')35;-->stringto convert

考虑到这一点,我认为这是必须的,尽管它非常复杂。只是想补充一点,您可能需要显式地将扩展字符串定义为regex,具体取决于解释器:
m.expand(r'\1')
工作,而
m.expand('\1')
被视为ASCII 001(至少在3.7.2上).pythonv3.6+使用fstring:re.sub(r'foo([a-z]+)bar',lambda match:fr'foo{match.group(1.upper()}bar',x)