Используйте группы захвата (обратите внимание на "\" перед "(" и ")" и "\ 1", "\ 2" и т. Д.):
:%s/self\.fields_desc\.append(BitField(\("[a-zA-Z0-9]*"\), \(0x[0-9]\+\), \([0-9]\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g
изменения:
self.fields_desc.append(BitField("foo", 0x3, 4))
self.fields_desc.append(BitField("test", 0x5, 3))
до
self.fields_desc.append(BitField("foo" + str(self.__class__.i), 0x3, 4))
self.fields_desc.append(BitField("test" + str(self.__class__.i), 0x5, 3))
Примечание:
- Я избежал ".", Как "."соответствует любому символу (кроме новой строки), и вы хотите литерал "."персонаж.
- Я заменил
*
на +
для совпадений чисел: я сомневаюсь, что вы хотите сопоставить self.fields_desc.append(BitField("foo", 0x,)
и т. Д. - Если вы не уверены, правильный ли интервалто есть, у вас не всегда есть
self.fields_desc.append(BitField("foo", 0x3...
, но иногда self.fields_desc.append(BitField("foo",0x3
или self.fields_desc.append(BitField("foo", 0x3
, затем добавьте *
после пробелов.Хотя я бы посоветовал вместо этого стандартизировать ваш код.
См. Группировка регулярных выражений и Регулярная "точка" .
Как говорит Сидайл, вероятно, лучше научиться использовать встроенные классы символов "\ d", "\ w" (см. Сокращенные классы символов ) и т. Д .:
:%s/self\.fields_desc\.append(BitField(\("\w*"\), \(0x\d\+\), \(\d\+\)))/self.fields_desc.append(BitField(\1 + str(self.__class__.i), \2, \3))/g
Это как для краткости, так и читабельности.Кроме того, в противном случае читатели будут предполагать, что у вас есть особая причина для определения собственного класса символов (то есть, они будут читать его дважды, чтобы убедиться, что там нет какого-то неизвестного символа).