Подтвердить что ты не робот

Создание букв в верхнем регистре с использованием re.sub в python?

Во многих языках программирования следующие

найдите foo([a-z]+)bar и замените на GOO\U\1GAR

приведет к тому, что весь матч будет выполнен в верхнем регистре. Я не могу найти эквивалент в python; он существует?

4b9b3361

Ответ 1

Вы можете передать функцию re.sub(), которая позволит вам сделать это, вот пример:

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

И пример его использования:

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

Ответ 2

Вы имеете в виду что-то вроде этого?

>>>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'

Для справки, здесь docstring re.sub (выделение мое).

Вернуть строку, полученную путем замены самого левого неперекрывающиеся вхождения шаблона в строке с помощью замена. repl может быть либо строкой , либо вызываемой; если строка, обратная косая черта в ней обрабатывается. Если это вызываемый, он передал объект соответствия и должен вернуться заменяющую строку, которая будет использоваться.

Ответ 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'

Ответ 4

Если у вас уже есть строка замены (шаблон), вы можете не увлекаться ее заменой подробностью m.group(1)+...+m.group(2)+...+m.group(3)... Иногда приятно иметь аккуратную небольшую строку.

Вы можете использовать функцию MatchObject expand(), чтобы оценить шаблон для совпадения таким же образом, как sub(), что позволяет сохранить как можно больше исходного шаблона. Вы можете использовать upper на соответствующих фрагментах.

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

Хотя это не было бы особенно полезно в приведенном выше примере, и, хотя это не помогает в сложных обстоятельствах, может быть более удобным для более длинных выражений с большим количеством захваченных групп, таких как регулярное выражение цензуры MAC-адресов, где вы просто хотите, чтобы полная замена была капитализирована или нет.

Ответ 5

Для тех, кто сталкивается с этим в google...

Вы также можете использовать 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