У меня есть строки вида: *.rem.1.gz и *.rem.2.gz.
И я хочу заменить его на *.1.trim.gz и *.2.trim.gz.
Файлы номер 1 и номер два связаны друг с другом, и я хочу создать отдельную строку, чтобы включить оба файла одновременно.
import os
allfiles = os.listdir
pair = [x.replace("rem.(\d+)","(\d+).trim")for x in allfiles] ##obviously this doesn't work but just want to give an idea what I want to do!
Спасибо за помощь!
(\d+)
не имеет смысла в строке замены. Поскольку вы помещаете исходное совпадение в круглые скобки, делая его группой захвата, вы можете просто ссылаться на него как \1
в строке замены. (Обратите внимание, что для работы этого метода требуется необработанный строковый литерал — префикс r
в строке.)
@OneCricketeer «Заменить rem на обрезку» вслепую опасно; например это будет неправильно для premium_content.rem.1.gz
. И хотя вы можете сделать это без регулярного выражения... почему? поскольку это именно то, в чем регулярное выражение превосходно.
Вы можете использовать (?i)(.*)\.rem\.([0-9]+)\.gz
, если он не чувствителен к регистру, или (.*)\.rem\.([0-9]+)\.gz
в противном случае.
import re
s = "*.rem.1.gz"
p = r'(?i)(.*)\.rem\.([0-9]+)\.gz'
print(re.sub(p, r'\1.\2.trim.gz', s))
*.1.trim.gz
Используя идею из следующего комментария, вы можете упростить код.
Нет необходимости фиксировать базовое имя в группе. Вместо этого закрепите конец строки с помощью $. - покраснел
import re
s = "*.rem.1.gz"
p = r'(?i)\.rem\.([0-9]+)\.gz$'
print(re.sub(p, r'.\1.trim.gz', s))
Нет необходимости фиксировать базовое имя в группе. Вместо этого закрепите конец строки с помощью $
.
Я не думаю, что вам нужно регулярное выражение. Замените rem на обрезку, разделите на точку, поменяйте местами, затем снова присоединитесь к строке.