2012-03-25 2 views
3

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

" and “ 

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

\"*\“* 

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

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

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

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

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

Edit2

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

Состояние

Никакие внешние библиотеки не допускаются, могут быть использованы только нативные библиотеки Python.

+0

Замена кавычек вряд ли является задачей для регулярных выражений. Я бы получил список котировок (unicode?) И выполнил обычную «замену». –

+0

@Lev Levitsky: Как именно здесь работает юникод? Я не могу это сделать, используя функцию replace. Я попытался заменить ('' ',' '), но он не заменяет другой тип цитаты' ''. Если я добавлю его в другую функцию замены, это вызовет ошибку символа NON-ASCII. Я новичок в unicode. – Dexter

+0

Похоже, что ваш вызов 'urllib.unquote' запускается в следующую, но неразрешенную ошибку Python: http://bugs.python.org/issue8136 – Abel

ответ

0

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

regexp = ru'\"*\“*' 

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

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

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

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

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

+0

Это отвечает на второе редактирование, а не на ваш первоначальный вопрос: «Сколько разных типов кавычки существуют? Есть ли способ нормализовать их только для одного типа, чтобы мое регулярное выражение не нарушало невидимые данные? »_ этому не отвечает. Первая часть: 29 типов кавычек в соответствии с Unicode, вторая часть:' \ p {QuotationMark} '(но требует внешних библиотек в настоящее время). – Abel

+0

@Abel достаточно, но теперь я могу добавить его в регулярное выражение (29 типов), которое я хотел. – Dexter

3

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

Вы можете сохранить список общих символов кодового обозначения юникода (here's a list for a good start), и создайте часть регулярного выражения, которая будет котироваться программно.

+0

Извините, что беспокою вас об этом, но как именно он будет работать? Я нахожу ошибку символа NON-ASCII в функции замены (проверьте отредактированный вопрос). – Dexter

+0

Несколько вещей, которые я хотел бы попробовать: убедитесь, что ваш редактор сохраняет файлы, закодированные как utf-8, помещает комментарий # coding: utf-8 в начало исходного файла, помещает «u» перед строкой, содержащей символы котировки Unicode , вот так: u "» ". – kristaps

+2

Если вы используете библиотеку 'regex' Matthew Barnett для Python 2 или 3, вы можете использовать' \ p {qmark} '. – tchrist

1

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

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

29, в соответствии с Unicode, см. Ниже.

Стандарт Unicode приносит нам текстовый файл в свойствах Unicode, PropList.txt, среди которых список кавычек. Поскольку Python не support all Unicode properties in regular expressions, вы в настоящее время не можете использовать \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» было отмечено выше, вы можете спасти себя неприятности с помощью Matthew Barnett's regex library, который поддерживает \p{QuotationMark}.

+0

Спасибо, но я не могу использовать внешние библиотеки. Я отредактировал вопрос, чтобы указать это. – Dexter

+0

@mcenley: Я вижу, поэтому выберите другой вариант и используйте класс символов. Просто скопируйте и вставьте и удалите пробелы (но также: исправьте проблему с кодировками, до этого все ставки не будут;). – Abel

+0

Как исправить проблемы с кодировкой? Это действительно для меня, а не для того, за что я подписался. :-( – Dexter

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