Python убрать квадратные скобки и лишнюю информацию между ними - PullRequest
11 голосов
/ 06 мая 2020

Я пытаюсь обработать файл, и мне нужно удалить из файла постороннюю информацию; в частности, я пытаюсь удалить скобки [], включая текст внутри и между блоками скобок [] [], говоря, что все между этими блоками, включая их самих, но печатает все, что находится за его пределами.

Ниже мой текстовый файл с образцом данных:

$ cat smb
Hi this is my config file.
Please dont delete it

[homes]
  browseable                     = No
  comment                        = Your Home
  create mode                    = 0640
  csc policy                     = disable
  directory mask                 = 0750
  public                         = No
  writeable                      = Yes

[proj]
  browseable                     = Yes
  comment                        = Project directories
  csc policy                     = disable
  path                           = /proj
  public                         = No
  writeable                      = Yes

[]

This last second line.
End of the line.

Желаемый результат:

Hi this is my config file.
Please dont delete it
This last second line.
End of the line.

Что я пробовал, основываясь на моем понимании и повторном поиске:

$ cat test.py
with open("smb", "r") as file:
  for line in file:
    start = line.find( '[' )
    end = line.find( ']' )
    if start != -1 and end != -1:
      result = line[start+1:end]
      print(result)

Вывод:

$ ./test.py
   homes
   proj

Ответы [ 12 ]

2 голосов
/ 12 мая 2020

Вот, вероятно, один из самых чистых способов сделать это.

import re
from pathlib import Path
res = '\n'.join(re.findall(r'^\w.*', Path('smb').read_text(), flags=re.M))

Объяснение:

Path создает объект Path для файла. Path.read_text() открывает файл, читает текст и закрывает файл. Содержимое файла передается в re.findall, который использует флаг re.M для просмотра каждой строки в файле, чтобы снова проверить шаблон '^\w.*', который будет принимать только строки, начинающиеся с символа слова. Это исключает строки, начинающиеся с пробела или скобок.

1 голос
/ 09 мая 2020

Попробовать r"(?s)\s*\[[^\[\]]*\](?:(?:(?!\[[^\[\]]*\]).)+\[[^\[\]]*\])*\s*"
Заменить r"\n"

демо

...