Take the 2-minute tour ×

I'm trying to get some regex to parse some values stored in a set of lua files, each line looks something like one of these two lines

  1. ITEM.ID = 'item_clock';\r\n
  2. ITEM.Cost = 150;\r\n.

when I run my regex pattern on the first line I get an expected result

>>> re.search("ITEM.(?P<key>[a-zA-Z]\w) = (?P<value>.*);", line).groupdict()
{'key': 'ID', 'value': "'item_clock'"}

however when I run it on the second line, I don't get a Match object.

share|improve this question

2 Answers 2

up vote 7 down vote accepted

The regex looks for ITEM. followed by a letter then followed by exactly one word character (the \w in the regex).

You probably meant something like ITEM.(?P<key>[a-zA-Z]\w*)... (note the added asterisk). This will look for ITEM. followed by a letter then followed by zero or more word characters.

Also, it's a good idea to use raw strings for regular expressions to avoid hard-to-spot bugs:

r"ITEM.(?P<key>[a-zA-Z]\w*) = (?P<value>.*);"

(note the r prefix).

share|improve this answer
thanks, that has worked perfectly! I'm just starting to get my head around regex. –  H4Z3Y Oct 13 '11 at 12:41
@H4Z3Y: I've just added a note about raw strings. I think it's a good habit to get into. –  NPE Oct 13 '11 at 12:48
alright, cheers, I've done that in now –  H4Z3Y Oct 13 '11 at 12:50
+1 for raw strings. This is such a good idea that python should really just enforce it, since that seems to be a big part of their design philosophy anyway. –  andronikus Oct 13 '11 at 13:36

Accepted answer is right. Minor tweaks...

  • escape the "." after ITEM to mean a "." and not just anything
  • usually a good idea to allow for more than one space (or no spaces) around the "="

    r"ITEM\.(?P<key>[a-zA-Z]\w*) *= *(?P<value>.*?) *;"

share|improve this answer
I think escaping the spaces just as you did with the dot is a good idea too. –  heltonbiker Oct 13 '11 at 13:54
Agreed the best is to replace the " *" with "\s*" ... better regex but a little less readable ... like regex is ever readable –  Phil Cooper Oct 13 '11 at 14:09
Actually I meant \ (with the space character), but I think in the end there is indeed a lot of "space" (pun intended) for personal preference ;o). So it would become r"ITEM\.(?P<key>[a-zA-Z]\w*)\ *=\ *(?P<value>.*?) *;" (formatting removed one space :o( –  heltonbiker Oct 13 '11 at 19:17

Your Answer


