?
=?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=
Hi experts,
I've built a class for parsing a user-defined list of files and matching
lines with a user-defined list of regular expressions. It looks like this:
<code>
import re
import glob
class LineMatcher:
""" Parses a list of text files, matching their lines with the given
regular expressions and executing associated actions."""
def __init__(self):
# List of file names to parse for matching.
self.file_names = []
# Association of reg expressions to actions to execute when match.
self.regexp_action = {}
def go(self):
for file_name in self.file_names:
file = open(file_name)
for line in file:
for regexp, action in self.regexp_action.items():
match = regexp.match(line)
if match:
action(line, match.groupdict())
def add_files(self, file_pattern):
self.file_names.extend(glob.glob(file_pattern))
def add_action(self, regexp_string, action):
self.regexp_action[re.compile(regexp_string)] = action
</code>
But then, when I try to use my class using actions with "memory" it will
fail:
<code>
import LineMatcher
global count
count = 0
def line_action(line, match_dictionary):
count = count + 1
line_matcher = LineMatcher.LineMatcher()
line_matcher.add_files('*')
line_matcher.add_action(r'(?P<line>.*)', line_action)
line_matcher.go()
</code>
The error is:
<console>
Traceback (most recent call last):
File "Test.py", line 12, in ?
line_matcher.go()
File "LineMatcher.py", line 21, in go
action(line, match.groupdict())
File "Test.py", line 7, in line_action
count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment
</console>
How would you do this?
Regards,
Tito
I've built a class for parsing a user-defined list of files and matching
lines with a user-defined list of regular expressions. It looks like this:
<code>
import re
import glob
class LineMatcher:
""" Parses a list of text files, matching their lines with the given
regular expressions and executing associated actions."""
def __init__(self):
# List of file names to parse for matching.
self.file_names = []
# Association of reg expressions to actions to execute when match.
self.regexp_action = {}
def go(self):
for file_name in self.file_names:
file = open(file_name)
for line in file:
for regexp, action in self.regexp_action.items():
match = regexp.match(line)
if match:
action(line, match.groupdict())
def add_files(self, file_pattern):
self.file_names.extend(glob.glob(file_pattern))
def add_action(self, regexp_string, action):
self.regexp_action[re.compile(regexp_string)] = action
</code>
But then, when I try to use my class using actions with "memory" it will
fail:
<code>
import LineMatcher
global count
count = 0
def line_action(line, match_dictionary):
count = count + 1
line_matcher = LineMatcher.LineMatcher()
line_matcher.add_files('*')
line_matcher.add_action(r'(?P<line>.*)', line_action)
line_matcher.go()
</code>
The error is:
<console>
Traceback (most recent call last):
File "Test.py", line 12, in ?
line_matcher.go()
File "LineMatcher.py", line 21, in go
action(line, match.groupdict())
File "Test.py", line 7, in line_action
count = count + 1
UnboundLocalError: local variable 'count' referenced before assignment
</console>
How would you do this?
Regards,
Tito