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的新手)。模式未返回任何匹配项。向专家成员寻求帮助。
完全修订的答案
我添加了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
模式下,它忽略了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')]