Вопрос по regex, python – почему это регулярное выражение не может найти результат

2

У меня есть код Python, как показано ниже: Мой вопрос заключается в том, почему сопоставляемая переменная [& apos; & APOS;]? (Я использовал регулярное выражение в regexpal.com, он может найти правильный результат | Имя = А. Джонсон | там)

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*name\s*=(.)*?\|",a,re.I)
Я понимаю, почему результат отличается от python и regexpal.com. Регулярное выражение Python будет обрабатывать () иначе, чем другие. () findall в python вернет материал в (), а не в целом. Так что просто поменяйте \ |? \ Sname\s*=(.)? \ | к \ |? \ sname\s*=.? \ | может решить проблему Peiti Li

Ваш Ответ

3   ответа
0
matched = re.findall("\|?\s*[nN]ame\s*=([a-zA-Z\.\s]+)\|?",a,re.I)
print matched

выход:

['A. Johnson ']
3

(.*?)не(.)*?& # x2014; последний (что у вас есть) будет захватывать только один символ, даже если онconsumes больше, чем один. Группа захвата будет возвращена только один раз, даже если сама группа имеет повторение; так что последний захватывает один символ(.) несмотря на его повторение.

Если вы переместите повтор в группу захвата с(.*?)вы получите более одного символа в ответе.

0

как оно обрабатывает группировку. В качестве более простого примера рассмотрим разницу между выводом следующих строк кода:

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

Похоже, что код, который вы хотите, будет больше похож на:

re.findall("\|\s*name\s*=([^\|\}]*)", a, re.I)

Похожие вопросы