regular expression i'm going crazy

Robert Kern robert.kern at gmail.com
Mon May 16 12:51:49 EDT 2011


On 5/16/11 11:25 AM, Tracubik wrote:
> pls help me fixing this:
>
> import re
> s = "linka la baba"
> re_s = re.compile(r'(link|l)a' , re.IGNORECASE)
>
> print re_s.findall(s)
>
> output:
> ['link', 'l']
>
> why?
> i want my re_s to find linka and la, he just find link and l and forget
> about the ending a.
>
> can anyone help me? trying the regular expression in redemo.py (program
> provided with python to explore the use of regular expression) i get what
> i want, so i guess re_s is ok, but it still fail...
> why?

The parentheses () create a capturing group, which specifies that the contents 
of the group should be extracted. See the "(...)" entry here:

   http://docs.python.org/library/re#regular-expression-syntax

You can use the non-capturing version of parentheses if you want to just isolate 
the | from affecting the rest of the regex:

"""
(?:...)  A non-capturing version of regular parentheses. Matches whatever 
regular expression is inside the parentheses, but the substring matched by the 
group cannot be retrieved after performing a match or referenced later in the 
pattern.
"""

[~]
|1> import re

[~]
|2> s = "linka la baba"

[~]
|3> re_s = re.compile(r'(?:link|l)a' , re.IGNORECASE)

[~]
|4> print re_s.findall(s)
['linka', 'la']


-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco




More information about the Python-list mailing list