Символ дефиса '-' создает проблемы при использовании регулярных выражений для BeautifulSoup - PullRequest
0 голосов
/ 26 февраля 2019

Я учусь создавать веб-страницы с помощью Python, используя статью в Wikepedia.Мне удалось получить нужные мне данные, таблицы, используя метод .get_text () для строк таблицы ().

Я очищаю данные в Pandas, и одна из процедур включает получение датыкнига или фильм был опубликован.Так как это может происходить многими способами, например: (1986) (1986-1989) (1986-настоящее время)

В настоящее время я использую приведенный ниже код, который работает с тестовым предложением:

# get the first columns of row 19 from the table and get its text
test = data_collector[19].find_all('td')[0]
text = test.get_text()
#create and test the pattern
pattern = re.compile('\(\d\d\d\d\)|\(\d\d\d\d-\d\d\d\d\)|\(\d\d\d\d-[ Ppresent]*\)')
re.findall(pattern, 'This is Agent (1857), the years were (1987-1868), which lasted from (1678- Present)')

Я получаю ожидаемый результат в тестовом предложении.

['(1857)', '(1987-1868)', '(1678- Present)']

Однако, когда я проверяю его на определенном фрагменте текста из статьи вики ' Приключения Шерлока Холмса(1891–1892) (серия), (1892) (роман), Артур Конан Дойл \ n ', я могу извлечь (1892), но НЕ (1891-1892).

text = test.get_text()
re.findall(pattern, text)
o/p: ['(1892)']

Даже когда я набираю это, я вижу, что дефис, который я использую, и дефис в тексте отличаются.Я уверен, что это проблема, и надеялся, что кто-нибудь скажет мне, как называется этот конкретный символ и как я могу «напечатать» его с помощью клавиатуры.

Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

Я предлагаю улучшить шаблон для поиска наиболее распространенных дефисов, -, и , и исправить шаблон present из класса символов в последовательности символов (чтобы не совпадать sent с [ Ppresent]*):

re.compile(r'\(\d{4}(?:[\s–—-]+(?:\d{4}|present))?\)', re.I)

См. Демонстрационную версию regex .Обратите внимание, что флаг re.I сделает соответствие регулярному выражению регистронезависимым.

Подробности

  • \( - (
  • \d{4} - четыре цифры ({4} - ограничивающий квантификатор, повторяющий шаблон, который он изменяет четыре раза)
  • (?:[\s–—-]+(?:\d{4}|present))? - необязательный (так как в конце есть ?)не захватывающая (из-за ?:) группа, соответствующая 1 или 0 вхождениям
    • [\s–—-]+ - 1 или более пробелов, -, или
    • (?:\d{4}|present) - либо 4 цифры, либо present
  • \) - ) символ.

Если вы планируете сопоставить любые дефисы, используйте [\u002D\u058A\u05BE\u1400\u1806\u2010-\u2015\u2E17\u2E1A\u2E3A\u2E3B\u2E40\u301C\u3030\u30A0\uFE31\uFE32\uFE58\uFE63\uFF0D\s]+ вместо [\s–—-]+.

Или, чтобы сопоставить любые 1+ несловарных символов в этом месте, возможно, отличных от ( и ), используйте [^\w()]+ вместо: re.compile(r'\(\d{4}(?:[^\w()]+(?:\d{4}|present))?\)', re.I).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...