首页 > 解决方案 > 我正在尝试从文件中提取一行

问题描述

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 =”的行。我重用了一个有效的多行模式(在另一种情况下)。(我是正则表达式的新手)。该模式没有返回匹配项。请求专家成员的帮助。

标签: regexmultiline

解决方案


完全修订的答案

我添加了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

此标志允许您通过允许您在视觉上分离模式的逻辑部分并添加注释来编写看起来更好且更具可读性的正则表达式。模式中的空格被忽略,除非在字符类中,或者前面有未转义的反斜杠,或者在像 *?、(?: 或 (?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')]

推荐阅读