[英]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
模式下,它忽略了DISPLAY
和MANAGER
(以及其他地方)之間的空格字符。 來自 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.