Connect with Expertise | Find Experts, Get Answers, Share Insights

DOTALL not working as expected

Stefan Palme
 
Posts: n/a
#1: Jan 18 '07

Hi all,

using the "re" module of Python (2.3 and 2.4), I tried the following:

import re
print re.sub('X.*?Y', 'Z', 'Xab\ncdY', re.DOTALL)

I wanted to replace
Xab
cdY
by a single "Z", but the "." in the pattern does not match the
included "\n".

When using the pattern "X(.|\n)*?Y" (explicity including "\n"
in the set of "any character") I get the wanted result.

My fault or a bug in the module?

Thanks
-stefan-


Stefan Palme
 
Posts: n/a
#2: Jan 18 '07

re: DOTALL not working as expected



Just noticed, that it works when *compiling* the pattern:

import re
p = re.compile('X.*?Y', re.DOTALL)
print re.sub(p, 'Z', 'Xab\ncdY')

Still the question - my fault or a bug?

Best regards
-stefan-


On Thu, 18 Jan 2007 11:10:08 +0100, Stefan Palme wrote:
>
Hi all,
>
using the "re" module of Python (2.3 and 2.4), I tried the following:
>
import re
print re.sub('X.*?Y', 'Z', 'Xab\ncdY', re.DOTALL)
>
I wanted to replace
Xab
cdY
by a single "Z", but the "." in the pattern does not match the
included "\n".
>
When using the pattern "X(.|\n)*?Y" (explicity including "\n"
in the set of "any character") I get the wanted result.
>
My fault or a bug in the module?
>
Thanks
-stefan-
Roberto Bonvallet
 
Posts: n/a
#3: Jan 18 '07

re: DOTALL not working as expected


Stefan Palme wrote:
>using the "re" module of Python (2.3 and 2.4), I tried the following:
>>
> import re
> print re.sub('X.*?Y', 'Z', 'Xab\ncdY', re.DOTALL)
>>
Just noticed, that it works when *compiling* the pattern:
>
import re
p = re.compile('X.*?Y', re.DOTALL)
print re.sub(p, 'Z', 'Xab\ncdY')
>
Still the question - my fault or a bug?
Your fault. According to the documentation [1], the re.sub function takes
a count as a fourth argument, not the compilation flags.

[1] http://docs.python.org/lib/node46.html

Cheers,
--
Roberto Bonvallet
Stefan Palme
 
Posts: n/a
#4: Jan 18 '07

re: DOTALL not working as expected



arghh.
Thanks for removing my blindness :)
-stefan-

On Thu, 18 Jan 2007 10:38:35 +0000, Roberto Bonvallet wrote:
Stefan Palme wrote:
>>using the "re" module of Python (2.3 and 2.4), I tried the following:
>>>
>> import re
>> print re.sub('X.*?Y', 'Z', 'Xab\ncdY', re.DOTALL)
>>>
>Just noticed, that it works when *compiling* the pattern:
>>
> import re
> p = re.compile('X.*?Y', re.DOTALL)
> print re.sub(p, 'Z', 'Xab\ncdY')
>>
>Still the question - my fault or a bug?
>
Your fault. According to the documentation [1], the re.sub function takes
a count as a fourth argument, not the compilation flags.
>
[1] http://docs.python.org/lib/node46.html
>
Cheers,
Closed Thread