why this regex cannot find the result

Posted on

Question :

why this regex cannot find the result

I have a python code like below: My question is why the matched variable is [‘ ‘]? (I used the regex in regexpal.com, it can find the right result |Name=A. Johnson | there)

import re
a = 
'{{Infobox U.S. Cabinet |align=left |clear=yes |Name=A. Johnson |President=Andrew Johnson |President start=1865 |President end=1869 |Vice President=None |Vice President start=1865 |Vice President end=1869 |State=[[William H. Seward]] |State start=1865 |State end=1869 |War=[[Edwin M. Stanton]] |War start=1865 |War end=1868 |War 2=[[John Schofield|John M. Schofield]] |War start 2=1868 |War end 2=1869 |Treasury=[[Hugh McCulloch]] |Treasury start=1865 |Treasury end=1869 |Justice=[[James Speed]] |Justice start=1865 |Justice end=1866 |Justice 2=[[Henry Stanberry]] |Justice start 2=1866 |Justice end 2=1868 |Justice 3=[[William M. Evarts]] |Justice start 3=1868 |Justice end 3=1869 |Post=[[William Dennison (Ohio governor)|William Dennison]] |Post start=1865 |Post end=1866 |Post 2=[[Alexander Randall|Alexander W. Randall]] |Post start 2=1866 |Post end 2=1869 |Navy=[[Gideon Welles]] |Navy start=1865 |Navy end=1869 |Interior=[[John P. Usher]] |Interior date=1865 |Interior 2=[[James Harlan (senator)|James Harlan]] |Interior start 2=1865 |Interior end 2=1866 |Interior 3=[[Orville H. Browning]] |Interior start 3=1866 |Interior end 3=1869 }}'
matched = re.findall("|?s*names*=(.)*?|",a,re.I)
Asked By: Peiti Li


Answer #1:

You’ll want (.*?), not (.)*?—the latter (what you have) will only capture a single character, even if it consumes more than a single one. A capture group will only be returned once even if the group itself has a repeat; so the latter captures a single character (.) despite its repeat.

If you move the repeat into the capture group with (.*?), you’ll get more than a single character in the return.

Answered By: Peiti Li

Answer #2:

Looks to be how it’s handling grouping. As a simpler example, look at the difference between the output of the following lines of code:

re.findall("c(a)*t", "hi caaat hi")
re.findall("c(a*)t", "hi caaat hi")

It looks like the code you want would be more like:

re.findall("|s*names*=([^|}]*)", a, re.I)
Answered By: Asherah

Answer #3:

matched = re.findall("|?s*[nN]ames*=([a-zA-Z.s]+)|?",a,re.I)
print matched


['A. Johnson ']
Answered By: U2EF1

Leave a Reply

Your email address will not be published. Required fields are marked *