From: Peng Yu on
Hi,

Suppose that I have strings like the following

test(a b)a b
test(xy uv)xy uv
....

I want to change them to

test(a)a test(b)b
test(xy)xy test(uv)uv
....


The problem is that I don't know how to capture pattern that repeat
itself (like 'a' and 'xy' in the example). I could use 'test\((\w+)
(\w+)\)(\w) (\w)', but it will capture something like 'test(a b)x y',
which I don't want to.

I'm wondering if there is way to capture recurring patterns.


--
Regards,
Peng
From: Alex Willmer on
On Aug 7, 4:48 pm, Peng Yu <pengyu...(a)gmail.com> wrote:
> The problem is that I don't know how to capture pattern that repeat
> itself (like 'a' and 'xy' in the example). I could use 'test\((\w+)
> (\w+)\)(\w) (\w)', but it will capture something like 'test(a b)x y',
> which I don't want to.
>
> I'm wondering if there is way to capture recurring patterns.

Back references can deal with repetition.

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> re.match(r'test\((\w+) (\w+)\)\1 \2', 'test(xy uv)xy uv').groups()
('xy', 'uv')
>>> re.match(r'test\((\w+) (\w+)\)\1 \2', 'test(a b)x y')
>>>
From: MRAB on
Peng Yu wrote:
> Hi,
>
> Suppose that I have strings like the following
>
> test(a b)a b
> test(xy uv)xy uv
> ...
>
> I want to change them to
>
> test(a)a test(b)b
> test(xy)xy test(uv)uv
> ...
>
>
> The problem is that I don't know how to capture pattern that repeat
> itself (like 'a' and 'xy' in the example). I could use 'test\((\w+)
> (\w+)\)(\w) (\w)', but it will capture something like 'test(a b)x y',
> which I don't want to.
>
> I'm wondering if there is way to capture recurring patterns.
>
Use backreferences (it's in the documentation):

pattern = re.compile(r'test\((\w+) (\w+)\)\1 \2')