regex - 我正在尝试从文件中提取一行
问题描述
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
此标志允许您通过允许您在视觉上分离模式的逻辑部分并添加注释来编写看起来更好且更具可读性的正则表达式。模式中的空格被忽略,除非在字符类中,或者前面有未转义的反斜杠,或者在像 *?、(?: 或 (?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')]
推荐阅读
- svelte - 如何将 .js 文件添加到 Svelte REPL?
- node.js - VS 2019 社区中的 typescript 构建选项在哪里?
- .net-core - nuget 包无法在 VS 2019 中下载
- php - 按期分期付款 - PHP
- angular - Chrome 扩展内容脚本中的 Angular 元素
- reactjs - formik 表单中的 useFormik 是什么类型?
- ruby - Sinatra 根据请求安全地设置时区
- java - 如何找到在 Java 程序中创建的对象的数量?
- sql - 与贷款表的正确关系?
- php - 根据 WooCommerce 中的成本更改运输方式标签名称