簡體   English   中英

我正在嘗試從文件中提取一行行

[英]I am trying to extract a block of lines from a file

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=”的行。 我重用了一個有效的多行模式(在另一種情況下)。 (我是正則表達式的新手)。 模式返回不匹配。 請求專家成員的幫助。

完全修訂的答案

我添加了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模式下,它忽略了DISPLAYMANAGER (以及其他地方)之間的空格字符。 來自 Python 手冊:

re.VERBOSE

此標志允許您通過允許您在視覺上分隔模式的邏輯部分並添加注釋來編寫看起來更好且更具可讀性的正則表達式。 模式中的空白被忽略,除非在字符類中,或者前面有一個未轉義的反斜杠,或者在像 *?, (?: or (?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')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM