Я пытаюсь извлечь из файла блок строк

import re
def regex_func(string):
    pattern=re.compile(r"""(?mx)
    ^DISPLAY MANAGER\s*.*\s*
    \s*mOnlyCode=\s*.*\s*
    \s*mSafeMode=\s*.*\s*
    \s*mPendingTraversal=\s*.*\s*
    \s*mGlobalDisplayState=\s*.*\s*
    \s*mNextNonDefaultDisplayId=\s*.*\s*
    \s*mViewports=\s*(.*) deviceWidth=([\d]+), deviceHeight=([\d]+)\}\]$""")
    result = pattern.findall(string)
    if result:
        print(result)

def main():
   logfile = open("dumpstate.txt", "r", encoding='utf-8', errors='ignore')        
   regex_func(logfile.read())
   logfile.close()

Фрагмент ввода:

DUMP OF SERVICE display:
DISPLAY MANAGER (dumpsys display)
  mOnlyCode=false
  mSafeMode=false
  mPendingTraversal=false
  mGlobalDisplayState=ON
  mNextNonDefaultDisplayId=2
  mViewports=[DisplayViewport{type=INTERNAL, valid=true, displayId=0, uniqueId='local:0', physicalPort=0, orientation=0, logicalFrame=Rect(0, 0 - 1080, 2340), physicalFrame=Rect(0, 0 - 1080, 2340), deviceWidth=1080, deviceHeight=2340}]
  mDefaultDisplayDefaultColorMode=0
  mSingleDisplayDemoMode=false
  mWifiDisplayScanRequestCount=0
  mStableDisplaySize=Point(1080, 2340)
  mMinimumBrightnessCurve=[(0.0, 0.0), (2000.0, 50.0), (4000.0, 90.0)]

Проблема: я пытаюсь извлечь блок строк, начиная с «DISPLAY MANAGER» и заканчивая строкой, содержащей «mViewports =». Я повторно использовал многострочный шаблон, который работает (в другом случае). (Я новичок в регулярном выражении). Шаблон не возвращает совпадений. Обращение за помощью к экспертам.


person BK.Unnithan    schedule 10.02.2020    source источник


Ответы (1)


Полностью измененный ответ

Я добавил флаг re.DEBUG, чтобы увидеть, что на самом деле сканирует механизм регулярных выражений. Частично:

CHARACTER MATCH 'D'
CHARACTER MATCH 'I'
CHARACTER MATCH 'S'
CHARACTER MATCH 'P'
CHARACTER MATCH 'L'
CHARACTER MATCH 'A'
CHARACTER MATCH 'Y'
CHARACTER MATCH 'M'
CHARACTER MATCH 'A'
CHARACTER MATCH 'N'
CHARACTER MATCH 'A'
CHARACTER MATCH 'G'
CHARACTER MATCH 'E'
CHARACTER MATCH 'R'

Итак, в режиме VERBOSE он игнорировал пробел между DISPLAY и MANAGER (и в других местах). Из руководства Python:

re.VERBOSE

Этот флаг позволяет вам писать регулярные выражения, которые выглядят лучше и удобнее для чтения, позволяя визуально разделять логические части шаблона и добавлять комментарии. Пробелы в шаблоне игнорируются, за исключением случаев, когда они находятся в классе символов или когда им предшествует неэкранированная обратная косая черта, или внутри токенов, таких как * ?, (?: или (? P ‹...>. Когда строка содержит символ #, который не входит в класс символов и которому не предшествует неэкранированная обратная косая черта, все символы от самого левого такого символа # до конца строки игнорируются.

Затем я заменил каждое вхождение пробела на \x20, и это сработало:

import re
def regex_func(string):
    pattern=re.compile(r"""(?mx)
    ^DISPLAY\x20MANAGER\s*.*\s*
    \s*mOnlyCode=\s*.*\s*
    \s*mSafeMode=\s*.*\s*
    \s*mPendingTraversal=\s*.*\s*
    \s*mGlobalDisplayState=\s*.*\s*
    \s*mNextNonDefaultDisplayId=\s*.*\s*
    \s*mViewports=\s*(.*)\x20deviceWidth=([\d]+),\x20deviceHeight=([\d]+)\}\]$""")
    result = pattern.findall(string)
    if result:
        print(result)

text = """DUMP OF SERVICE display:
DISPLAY MANAGER (dumpsys display)
  mOnlyCode=false
  mSafeMode=false
  mPendingTraversal=false
  mGlobalDisplayState=ON
  mNextNonDefaultDisplayId=2
  mViewports=[DisplayViewport{type=INTERNAL, valid=true, displayId=0, uniqueId='local:0', physicalPort=0, orientation=0, logicalFrame=Rect(0, 0 - 1080, 2340), physicalFrame=Rect(0, 0 - 1080, 2340), deviceWidth=1080, deviceHeight=2340}]
  mDefaultDisplayDefaultColorMode=0
  mSingleDisplayDemoMode=false
  mWifiDisplayScanRequestCount=0
  mStableDisplaySize=Point(1080, 2340)
  mMinimumBrightnessCurve=[(0.0, 0.0), (2000.0, 50.0), (4000.0, 90.0)]"""

regex_func(text)

Печать:

[("[DisplayViewport{type=INTERNAL, valid=true, displayId=0, uniqueId='local:0', physicalPort=0, orientation=0, logicalFrame=Rect(0, 0 - 1080, 2340), physicalFrame=Rect(0, 0 - 1080, 2340),", '1080', '2340')]
person Booboo    schedule 10.02.2020