【问题标题】:python re.search not working on multiline stringpython re.search 不适用于多行字符串
【发布时间】:2015-01-30 17:51:20
【问题描述】:

我已经在字符串中加载了这个文件:

// some preceding stuff
static char header_data[] = {
    1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,
    1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,
    1,1,0,1,0,1,0,1,1,0,1,0,1,0,1,1,
    1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,
    0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,
    1,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,
    0,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,
    0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,
    0,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,
    0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,
    1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1,
    1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,
    1,0,1,1,1,0,0,1,1,0,0,0,0,0,1,1,
    1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,1,
    1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,1,
    1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1
    };

我只想获取带有 1 和 0 的块,然后以某种方式对其进行处理。

我导入了re,试过了:

In [11]: re.search('static char header_data(.*);', src, flags=re.M)

In [12]: re.findall('static char header_data(.*);', src, flags=re.M)
Out[12]: []

为什么它不匹配任何东西?如何解决这个问题? (是python3)

【问题讨论】:

  • 想想我的答案中的非贪婪匹配。否则,您将匹配多个 parethis 部分。但这取决于您的源文件的外观。
  • @wenzul 实际上它是文件中的最后一个大括号,但为了安全起见,我会添加它。
  • @wenzul 我拒绝了您的编辑,因为它根本没有改进它。当我遇到这个问题时,我几乎用谷歌搜索了我现在标题中的内容——这样人们很容易找到它。

标签: python regex multiline


【解决方案1】:

您需要使用re.S 标志,而不是re.M

  • re.M (re.MULTILINE) 控制^$ 的行为(无论它们是在整个字符串的开头/结尾还是在每行的开头/结尾匹配)。
  • re.S (re.DOTALL) 控制 . 的行为,当您希望允许点匹配换行符时,这是您需要的选项。

另请参阅documentation

【讨论】:

  • 谢谢,现在很好用。 “MULTILINE”这个名字有点混乱
【解决方案2】:

然后以某种方式处理它。

这里我们从文件中得到一个可用的列表:

import re
match = re.search(r"static char header_data\[\] = {(.*?)};", src, re.DOTALL)
if match:
    header_data = "".join(match.group(1).split()).split(',')
    print header_data

.*? 是一个非贪婪匹配,所以你真的会得到这组大括号之间的值。

没有DOTALLMULTILINE 的更明确的方法是

match = re.search(r"static char header_data\[\] = {([01,\s\r\n]*?)};", src)

【讨论】:

    【解决方案3】:

    如果文件的格式没有改变,你还不如不使用re,而是使用切片。这些线路上的东西可能有用

    >>> file_in_string
    '\n// some preceding stuff\nstatic char header_data[] = {\n    1,1,1,1,1,1,0,0,0
    ,0,1,1,1,1,1,1,\n    1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,\n    1,1,0,1,0,1,0,1,1,0,1
    ,0,1,0,1,1,\n    1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,\n    0,0,0,1,1,1,1,1,1,1,1,1,1
    ,0,1,1,\n    1,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,\n    0,1,0,0,0,1,0,0,1,1,1,1,0,0,0
    ,0,\n    0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,\n    0,1,1,1,0,0,0,0,0,0,1,1,0,1,1,0,\
    n    0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,\n    1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1,\n
     1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,\n    1,0,1,1,1,0,0,1,1,0,0,0,0,0,1,1,\n    1,1
    ,0,1,0,1,0,1,1,1,1,0,0,0,0,1,\n    1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,1,\n    1,1,1,1
    ,1,1,0,0,0,0,1,1,1,1,1,1\n    };\n'
    >>> lines = file_in_string.split()
    >>> lines[9:-1]
    ['1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,', '1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,', '1,1,0,
    1,0,1,0,1,1,0,1,0,1,0,1,1,', '1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,', '0,0,0,1,1,1,1,
    1,1,1,1,1,1,0,1,1,', '1,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,', '0,1,0,0,0,1,0,0,1,1,1,
    1,0,0,0,0,', '0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,', '0,1,1,1,0,0,0,0,0,0,1,1,0,1,1,
    0,', '0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,', '1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1,', '1,
    1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,', '1,0,1,1,1,0,0,1,1,0,0,0,0,0,1,1,', '1,1,0,1,0,
    1,0,1,1,1,1,0,0,0,0,1,', '1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,1,', '1,1,1,1,1,1,0,0,0,
    0,1,1,1,1,1,1']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2016-05-22
      • 2017-11-22
      相关资源
      最近更新 更多