Необработанные строки Python и Unicode: как использовать веб-ввод в качестве шаблонов регулярных выражений? - PullRequest
3 голосов
/ 17 января 2010

РЕДАКТИРОВАТЬ: Этот вопрос на самом деле не имеет смысла, когда вы подняли, что означает флаг "r". Подробнее здесь . Для тех, кто ищет быстрый ответ, я добавил ниже.

Если я ввожу регулярное выражение вручную в скрипте Python, я могу использовать 4 комбинации флагов для моих строк шаблона:

  • p1 = "pattern"
  • p2 = u "pattern"
  • p3 = r "pattern"
  • p4 = ru "pattern"

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

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

import re
assert re.match(p1, some_text) == re.match(someProcess1(web_input), some_text)
assert re.match(p2, some_text) == re.match(someProcess2(web_input), some_text)
assert re.match(p3, some_text) == re.match(someProcess3(web_input), some_text)
assert re.match(p4, some_text) == re.match(someProcess4(web_input), some_text)

Каким будет какой-нибудь Process1 для someProcessN и почему?

Я полагаю, что someProcess2 не нужно ничего делать, в то время как someProcess1 должен выполнить некоторое преобразование юникода в локальную кодировку. Что касается необработанных строковых литералов, я ничего не понимаю.

Ответы [ 3 ]

6 голосов
/ 17 января 2010

Помимо необходимости кодировать Unicode должным образом (в Python 2. *), не требуется никакой обработки, потому что не существует определенного типа для «необработанных строк» ​​- это просто синтаксис для литералов, т.е. для строковых констант, и в вашем фрагменте кода нет строковых констант, поэтому «обрабатывать» нечего.

1 голос
/ 17 января 2010

Обратите внимание на следующее в вашем первом примере:

>>> p1 = "pattern"
>>> p2 = u"pattern"
>>> p3 = r"pattern"
>>> p4 = ur"pattern" # it's ur"", not ru"" btw
>>> p1 == p2 == p3 == p4
True

Хотя эти конструкции выглядят по-разному, все они делают одно и то же, они создают строковый объект (p1 и p3 a str и p2 и p4 a unicode объект в Python 2.x), содержащий значение "pattern». u, r и ur просто сообщают синтаксическому анализатору, как интерпретировать следующую строку в кавычках, а именно как текст в Unicode (u) и / или необработанный текст (r), где обратная косая черта должна кодироваться другие символы игнорируются. Однако, в конце концов, не имеет значения, как была создана строка, является ли она необработанной строкой или нет, внутри она сохраняется одинаково.

Когда вы получаете текст Unicode в качестве входных данных, вы должны различаться (в Python 2.x), если это текст unicode или объект str. Если вы хотите работать с содержимым Unicode, вы должны внутренне работать только с ними и конвертировать все str объекты в unicode объекты (либо с str.decode(), либо с синтаксисом u'text' для жестко закодированных текстов). Однако если вы закодируете его в локальную кодировку, у вас возникнут проблемы с символами Unicode.

Другой подход будет использовать Python 3, который str объект поддерживает Unicode напрямую и сохраняет все как Unicode и там, где вам просто не нужно заботиться о кодировке.

1 голос
/ 17 января 2010

Флаги "r" просто не позволяют Python интерпретировать "\" в строке. Поскольку Интернет не заботится о том, какие данные он переносит, ваш веб-ввод будет состоять из нескольких байтов, которые вы можете интерпретировать так, как хотите.

Итак, для решения этой проблемы:

  • убедитесь, что вы используете Unicode (например, utf-8) на протяжении всего пути
  • когда вы получите строку, это будет Unicode, а "\ n", "\ t" и "\ a" будут литералами, поэтому вам не нужно заботиться о том, нужно ли их избегать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...