2016-11-24 3 views
1

Я очистил несколько статей с веб-сайтов. Теперь я пытаюсь извлечь местонахождение новостей. Месторасположение написано либо капитализировано только столицей страны (например, «BRUSSELS-»), либо в некоторых случаях вместе со страной (например, «BRUSELLS, Belgium-»)Соответствие место с регулярными выражениями | Python

Это образец статей:

|[<p>Advertisement , By MILAN SCHREUER and  ALISSA J. RUBIN OCT. 5, 2016 
, BRUSSELS — A man wounded two police officers with a knife in Brussels around...] 
[<p>Advertisement , By DAVID JOLLY FEB. 8, 2016 
, KABUL, Afghanistan — A Taliban suicide bomber killed at least three people on Monday and wounded] 

регулярное выражение, которое я использовал это один:

text_open = open("Training_News_6.csv") 
text_read = text_open.read() 
pattern = ("[A-Z]{1,}\w+\s\—") 
result = re.findall(pattern,text_read) 
print(result) 

причина, почему я использовал оценка знак (-), потому что это повторяющийся паттерн, который содержит ссылки на место.

Однако этому регулярному выражению удается извлечь «БРЮССЕЛЬ», но когда дело доходит до «КАБУЛА, Афганистан», он извлекает только последнюю часть, а именно «Афганистан». Во втором случае я хотел бы выделить все место: столицу и страну. Есть идеи?

+0

Попробуйте 'r '([A-Z] +) (?: \ W + \ w +)? \ S * -''. См. Https://regex101.com/r/ATgIeZ/1 –

+0

Когда я его запускаю, он соответствует только словам, заглавными, и когда за Столиками следует запятая и страна, я хотел бы также их выдать –

+1

Просто переместите ') 'немного дальше: https://regex101.com/r/ATgIeZ/2 –

ответ

0

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

([A-Z]+(?:\W+\w+)?)\s*— 

Смотрите regex demo

Детали:

  • ([A-Z]+(?:\W+\w+)?) - Захват группы 1 (содержание которого будет возвращено в результате re.findall) улавливание
    • [A-Z]+ - 1 или более ASCII прописные буквы
    • (?:\W+\w+)? - 1 или 0 вхождений (из-за ? кванторные) 1+ без слов символов (\W+) и 1+ слово символы (\w+)
  • \s* - 0+ пробельные символы
  • - это символ

Python demo:

import re 
rx = r"([A-Z]+(?:\W+\w+)?)\s*—" 
s = "|[<p>Advertisement , By MILAN SCHREUER and  ALISSA J. RUBIN OCT. 5, 2016 \n, BRUSSELS — A man wounded two police officers with a knife in Brussels around...] \n[<p>Advertisement , By DAVID JOLLY FEB. 8, 2016 \n, KABUL, Afghanistan — A Taliban suicide bomber killed at least three people on Mo" 
print(re.findall(rx, s)) # => ['BRUSSELS', 'KABUL, Afghanistan'] 
0

Одна вещь, которую вы можете сделать, это добавить , и \s в свой первый выбор символов, а затем удалить все пробелы и запятые слева. ,[A-Z,\s]{1,}\w+\s\— Или даже что-то более простое, например: ,(.+)\—. $1 будет вашим совпадением, содержащим дополнительные символы. Другой вариант, который может работать: ,\s*([A-Za-z]*[,\s]*[A-Za-z]*)\s\— или упрощенные версии: ,\s*([A-Za-z,\s]*)\s\—. Еще раз $1 - ваш ответ.

Смежные вопросы