我正在尝试从文件中提取一行行

问题描述 投票:0回答:1
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 =“的行。我重用了一种有效的多行模式(在另一种情况下)。 (我是regex的新手)。模式未返回任何匹配项。向专家成员寻求帮助。

regex multiline
1个回答
0
投票

完全修订的答案

我添加了re.DEBUG标志,以查看正则表达式引擎实际扫描的内容。部分:

CHARACTER MATCH '\n'
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

此标志使您可以直观地分隔模式的逻辑部分并添加注释,从而可以编写看起来更美观,更易读的正则表达式。 模式内的空白将被忽略,除非在字符类中,或者在前加一个未转义的反斜杠,或者在诸如* ?、(?:或(?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')]
© www.soinside.com 2019 - 2024. All rights reserved.