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

StackOverflow https://stackoverflow.com/questions/2081622

Вопрос

Редактировать :Этот вопрос на самом деле не имеет смысла, как только вы поняли, что означает флаг "r".Более подробная информация здесь.Для людей, ищущих быстрый ответ, я добавил ниже.

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

  • p1 = "шаблон"
  • p2 = u"шаблон"
  • p3 = r"шаблон"
  • p4 = ru"шаблон"

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

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

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)

Что было бы someProcess1 для someProcessN и почему?

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

Итак, чтобы решить эту проблему:

  • убедитесь, что вы используете Unicode (например.utf-8) все время
  • когда вы получите строку, это будет Unicode, а « », « » и «\a» будут литералами, поэтому вам не нужно беспокоиться о том, нужно ли вам экранировать их или нет.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top