Вы можете использовать комбинацию модулей fileinput
и re
.
Вот код (я разместил комментарии в строке):
def modify_text_inside_brackets(file_name, tag):
with fileinput.input(files=(file_name), inplace=True) as text_file:
for line in text_file:
# split the line into groups
matches = re.match(r"(.*)(\[.*\])(.*)", line)
if matches:
# get the text inside the brackets
# group(0): the entire matching line
# group(1): everything before the opening [
# group(2): [ .. ]
# group(3): everything after the closing ]
text_inside_brackets = matches.group(2)[1:-1]
# create a new [..] string with the prepended tag
modified_text = "[{},{}]".format(tag, text_inside_brackets.strip())
# replace the original [..] with the modified [..]
modified_line = line.replace(matches.group(2), modified_text)
# print out the modified line to the file
print(modified_line, end="")
else:
print(line, end="")
modify_text_inside_brackets("input.txt", "TAG")
Учитывая это "input.txt":
[ 123,456]
[ city is beautiful]
This text has no brackets and should be unchanged.
It can also [ handle lines with inline] brackets.
Код изменит его следующим образом:
[TAG,123,456]
[TAG,city is beautiful]
This text has no brackets and should be unchanged.
It can also [TAG,handle lines with inline] brackets.
Примечания:
fileinput.input
с inplace=True
перенаправляет вывод print
в файл
- Непонятно, что
<mystring>
и <newtag>
от вашего вопроса, поэтому я просто использовал TAG
.
- Изменить
"[{},{}]".format(tag, text_inside_brackets.strip())
в зависимости от необходимого формата вывода. Например, в вашем вопросе пробелы после [
и до ]
в ваших примерах несбалансированы и несовместимы, поэтому добавьте или strip()
пробелов по мере необходимости.
- Вы можете проверить / протестировать само регулярное выражение из этой демонстрации .
- Я передал
end=""
print
, потому что по умолчанию print
добавляет символ новой строки.