Skip to content Skip to sidebar Skip to footer

Python Re.search Not Working On Multiline String

I have this file loaded in string: // 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

Solution 1:

You need to use the re.S flag, not re.M.

  • re.M (re.MULTILINE) controls the behavior of ^ and $ (whether they match at the start/end of the entire string or of each line).
  • re.S (re.DOTALL) controls the behavior of the . and is the option you need when you want to allow the dot to match newlines.

See also the documentation.

Solution 2:

and then somehow process it.

Here we go to get a useable list out of the file:

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

.*? is a non-greedy match so you really will get just the value between this set of braces.

A more expicit way without DOTALL or MULTILINE would be

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

Solution 3:

If the format of the file does not change, you might as well not resort to re but use slices. Something on these lines could be useful

>>> 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']

Post a Comment for "Python Re.search Not Working On Multiline String"