2015-08-11 4 views
1

На regexr.com Я разработал регулярное выражение, которое соответствует определенным типам собственных имен. Вот выражение:Правильное выражение Python не соответствует всем ожидаемым словам

\b([a-z]?[A-Z]+[\w]*[ ]*)+\b 

Вы можете видеть, что жить с многочисленными примерами, совпадающим, как ожидается, в http://regexr.com/3bifh

Э.Г. из строки Моби Дик или Белый Кит Герман Мелвилл это соответствует Moby Dick, White Whale и Herman Melville

Я пытаюсь воспроизвести это в Python, с меньшим успехом. Вот код:

import re 

text = "Moby Dick or the White Whale by Herman Melville" 
print(re.findall(r"\b([a-z]?[A-Z]+[\w]*[ ]*)+\b", text)) 

Выход:

['Dick ', 'Whale ', 'Melville'] 

Это соответствует только последнюю часть каждого результата сверху. Почему выражение не работает в Python?

+0

Все, что выделены на странице regexpr.com скрипку. –

+2

«Возможно, это строчная буква, затем одна или несколько прописных букв, а затем необязательно больше букв и, возможно, пробел» - не работает ли это регулярное выражение в «\ w +» или я что-то упускаю? –

+0

Вы имеете в виду r "\ w +"? Нет. Я пытаюсь совместить собственные имена/аббревиатуры, такие как «Соединенные Штаты», «США», «Моби Дик», «Эдгар Аллен По» или «iPhone». Ключевой частью является буква верхнего регистра. –

ответ

2

Двигатель Regex запоминает только последнюю группу, если несколько групп совпадают.

Вы можете использовать это вместо

print (re.findall(r"\b((?:[a-z]?[A-Z]+[\w]*[ ]*)+)\b", text)) 
+0

Хорошо, но я не хочу разбивать согласованные части. –

+0

@DrunkenMaster отредактирован. Не требуется 'split'. Теперь ваше исходное регулярное выражение теперь нетронутым: P – vks

3

Включите группу захвата не-caturing группы.

print(re.findall(r"\b(?:[a-z]?[A-Z]+[\w]*[ ]*)+\b", text)) 

here Смотрите, он совпадает с первой частью, но захватывает вторую часть. re.findall дал бы первое предпочтение захватам, а затем пришли спички. Таким образом, он печатает вторую часть.

Измените свой узор, как удар, если вы не wznt, чтобы соответствовать символу пробега.

r'\b[a-z]?[A-Z]+\w*(?: [a-z]?[A-Z]+\w*)+' 

DEMO