Как извлечь текстовую часть из файла, используя Python и регулярные выражения - PullRequest
2 голосов
/ 24 апреля 2019

Используя Python, я хочу прочитать текстовый файл, найти строку и напечатать все строки между этой и другой соответствующей строкой.

Текстовый файл выглядит следующим образом:

Text=variables.Job_SalesDispatch.CaptionNew
    Tab=0
    TabAlign=0
    }
   }
  }
[UserVariables]
 User1=@StJid;IF(fields.Fieldtype="Artikel.Gerät"  , STR$(fields.id,0,0)  , @StJid)
[Parameters]
 [@Parameters]
  {
  [Parameters]
   {
   LL.ProjectDescription=? (default)
   LL.SortOrderID=
   }
  }
[PageLayouts]
 [@PageLayouts]
  {
  [PageLayouts]
   {
   [PageLayout]
    {
    DisplayName=
    Condition=Page() = 1
    SourceTray=0

Теперь я хочу напечатать все «UserVariables», поэтому только строки между [UserVariables] и следующей строкой начинаются с квадратной скобки.В этом примере это будет [Parameters].

То, что я до сих пор делал, это:

with open("path/testfile.lst", encoding="utf8", errors="ignore") as file:

  for line in file:
    uservars = re.findall('\b(\w*UserVariables\w*)\b', line)
    print (uservars)

, что дает мне только [].

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Если использование регулярных выражений не является обязательным для вас, вы можете пойти примерно так:

with open("path/testfile.lst", encoding="utf8", errors="ignore") as file:
  inside_uservars = False
  for line in file:
    if inside_uservars:
      if line.strip().startswith('['):
        inside_uservars = False
      else:
        print(line)
    if line.strip() == '[UserVariables]':
      inside_uservars = True
0 голосов
/ 24 апреля 2019

Мы можем попробовать использовать re.findall со следующим шаблоном регулярных выражений:

\[UserVariables\]\n((?:(?!\[.*?\]).)*)

Это говорит, что соответствует тегу [UserVariables], за которым следует слегка сложное выражение:

((?:(?!\[.*?\]).)*)

Это выражение представляет собой закаленную точку , которая соответствует любому символу, по одному за раз, при условии, что то, что находится впереди, не другой тег, заключенный в квадратные скобки.

matches = re.findall(r'\[UserVariables\]\n((?:(?!\[.*?\]).)*)', input, re.DOTALL)
print(matches)

[' User1=@StJid;IF(fields.Fieldtype="Artikel.Ger\xc3\xa4t"  , STR$(fields.id,0,0)  , @StJid)\n']

Edit:

В моем ответе предполагается, что все содержимое файла находится в памяти в одной строке Python. Вы можете прочитать весь файл, используя:

with open('Path/to/your/file.txt', 'r') as content_file:
    input = content_file.read()
matches = re.findall(r'\[UserVariables\]\n((?:(?!\[.*?\]).)*)', input, re.DOTALL)
print(matches)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...