Модификация текстового файла Python - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь написать синтаксический анализатор Python для изменения текста в квадратных скобках например если текстовый файл содержит

    Original File contents : [ city is beautiful]
    Modified File contents : [ The city is beautiful]

    Original File contents : [ 123,456]
    Modified File contents : [ <mystring>,123,456]

    : [<oldtext>] should become : [<newtag>,<oldtext>]

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать комбинацию модулей fileinput и re.

  • fileinput.input будет использоваться для редактирования файла на месте
  • re.match и match.group будут использоваться для ввода текста в скобках

Вот код (я разместил комментарии в строке):

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 добавляет символ новой строки.
...