Во многих языках программирования следующие
найдите foo([a-z]+)bar
и замените на GOO\U\1GAR
приведет к тому, что весь матч будет выполнен в верхнем регистре. Я не могу найти эквивалент в python; он существует?
Во многих языках программирования следующие
найдите foo([a-z]+)bar
и замените на GOO\U\1GAR
приведет к тому, что весь матч будет выполнен в верхнем регистре. Я не могу найти эквивалент в python; он существует?
Вы можете передать функцию re.sub()
, которая позволит вам сделать это, вот пример:
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'
Для справки, здесь docstring re.sub
(выделение мое).
Вернуть строку, полученную путем замены самого левого неперекрывающиеся вхождения шаблона в строке с помощью замена. repl может быть либо строкой , либо вызываемой; если строка, обратная косая черта в ней обрабатывается. Если это вызываемый, он передал объект соответствия и должен вернуться заменяющую строку, которая будет использоваться.
Вы можете использовать некоторые варианты этого:
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'
Если у вас уже есть строка замены (шаблон), вы можете не увлекаться ее заменой подробностью 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-адресов, где вы просто хотите, чтобы полная замена была капитализирована или нет.
Для тех, кто сталкивается с этим в 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