Поместите два типа цитат в регулярное выражение - PullRequest
3 голосов
/ 25 марта 2012

Я использую регулярное выражение для замены кавычек внутри входной строки. Мои данные содержат два «типа» цитат -

" and “

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

\"*\“*

Боюсь, однако, что в будущих данных я могу получить другой «тип» цитаты, по которому мое регулярное выражение может потерпеть неудачу. Сколько существует разных типов цитат? Есть ли способ нормализовать их только для одного типа, чтобы мое регулярное выражение не разрывалось для невидимых данных?

Редактировать -

Мои входные данные состоят из файлов HTML, и я экранирую сущности HTML и URL-адреса в ASCII

escaped_line = HTMLParser.HTMLParser().unescape(urllib.unquote(line.decode('ascii','ignore')))

где строка указывает каждую строку в файле HTML. Мне нужно «игнорировать» ASCII, поскольку все файлы в моей базе данных не имеют одинаковую кодировку, и я не знаю кодировку до чтения файла.

Редактировать2

Я не могу сделать это, используя функцию замены. Я попытался заменить ('"', ''), но он не заменяет другой тип кавычки" "". Если я добавлю его в другую функцию замены, он выдаст мне ошибку NON-ASCII.

Состояние

Внешние библиотеки запрещены, можно использовать только собственные библиотеки Python.

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

Я не думаю, что в реализации регулярных выражений Python есть класс символов "кавычки", поэтому вам придется делать сопоставление самостоятельно.

Вы можете сохранить список общих символов кавычек в юникоде ( вот список для хорошего начала ) и построить часть регулярного выражения, которая соответствует кавычкам программно.

1 голос
/ 25 марта 2012

Я могу помочь вам только с оригинальным вопросом о кавычках.Как выясняется, Unicode определяет много свойств на символ, и все они доступны через базу данных символов Unicode.«Кавычка» является одним из этих свойств.

Сколько существует различных типов кавычек?

29, согласно Unicode, см. Ниже.

Стандарт Unicode дает нам окончательный текстовый файл со свойствами Unicode, PropList.txt , среди которых список кавычек.Поскольку Python не поддерживает все свойства Юникода в регулярных выражениях , вы не можете использовать \p{QuotationMark}.Однако создать класс символов регулярного выражения тривиально:

// placed on multiple lines for readability, remove spaces
// and then place in your regex in place of the current quotes
[\u0022   \u0027    \u00AB    \u00BB
\u2018    \u2019    \u201A    \u201B
\u201C    \u201D    \u201E    \u201F
\u2039    \u203A    \u300C    \u300D
\u300E    \u300F    \u301D    \u301E
\u301F    \uFE41    \uFE42    \uFE43
\uFE44    \uFF02    \uFF07    \uFF62
\uFF63]

Как указывалось выше "tchrist", вы можете избавить себя от неприятностей, используя библиотеку регулярных выражений Мэтью Барнетта , которая поддерживает \p{QuotationMark}.

0 голосов
/ 25 марта 2012

Оказывается, есть гораздо более простой способ сделать это. Просто добавьте литерал 'u' перед своим регулярным выражением, которое вы пишете на python.

regexp = ru'\"*\“*'

Убедитесь, что вы используете флаг re.UNICODE, когда хотите скомпилировать / найти / сопоставить свое регулярное выражение с вашей строкой.

re.findall(regexp, string, re.UNICODE)

Не забудьте включить

#!/usr/bin/python
# -*- coding:utf-8 -*-

в начале исходного файла, чтобы убедиться, что строки unicode могут быть записаны в вашем исходном файле.

...