Разбор инфиксных математических выражений в Swift с использованием регулярных выражений

Префикс b означает bytes строковый литерал .

Если вы видите, что он используется в исходном коде Python 3, выражение создает bytes object , а не обычный объект Unicode str . Если вы видите, что это отражено в вашей оболочке Python или как часть списка, dict или другого содержимого контейнера, то вы видите объект bytes, представленный с использованием этой нотации.

bytes объекты в основном содержат последовательность из целых чисел в диапазоне 0-255, но если они представлены, Python отображает эти байты как кодовые точки ASCII, чтобы облегчить чтение их содержимого. Любые байты вне диапазона для печати символов ASCII отображаются как escape-последовательности (например, \n, \x82 и т. Д.).

Поскольку объект bytes состоит из последовательность целых чисел, вы можете построить объект bytes из любой другой последовательности целых чисел со значениями в диапазоне 0-255, например, список:

bytes([72, 101, 108, 108, 111])

bytes model двоичный данных , включая закодированный текст . Если ваше значение bytes содержит текст, вам необходимо его сначала декодировать, используя правильный кодек. Например, если данные кодируются как UTF-8, вы можете получить значение Unicode str с помощью:

strvalue = bytesvalue.decode('utf-8')

И наоборот, чтобы перейти от текста в объекте str к bytes вам нужно закодировать . Вам нужно решить, какую кодировку использовать; по умолчанию используется UTF-8, но то, что вам нужно, сильно зависит от вашего прецедента:

bytesvalue = strvalue.encode('utf-8')

Вы также можете использовать конструктор bytes(strvalue, encoding), чтобы сделать то же самое.

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

Python 2, версии 2.6 и 2.7 также поддерживают создание строки литералов с использованием синтаксиса строки b'..' string, чтобы облегчить выполнение кода, который работает как на Python 2, так и на 3.

1
задан Rohan 5 March 2019 в 05:20
поделиться

1 ответ

Ваш шаблон не работает, потому что он соответствует только тексту в начале строки (см. Якорь ^), тогда положительный прогноз (?=[+-/*]) требует, чтобы первый символ был оператором из указанного набора, но единственным оператором то, что вы потребляете, является необязательным -. Таким образом, когда * пытается сопоставить вложенную последовательность шаблонов во второй раз с -99+44+2+-3/3.2-6, он видит +44, а -?\d не может сопоставить его (поскольку он не знает, как сопоставить + с -? ). [+1128]

Вот как ваше регулярное выражение соответствует строке:

enter image description here

Вы можете токенизировать выражение, используя

let pattern = "(?<!\\d)-?\\d+(?:\\.\\d+)?|[-+*/%()]"
[1132 ] См. regex demo

Подробности

  • (?<!\d) - слева от текущей позиции не должно быть цифр
  • -? - необязательный -
  • \d+ - 1 или более цифр
  • (?:\.\d+)? - необязательная последовательность . и 1+ цифр
  • | - или
  • \D - любой символ, кроме цифры.

Вывод с использованием вашей функции:

Optional(["31", "+", "2", "-", "-3", "*", "43.8", "/", "1", "%", "(", "1", "*", "2", ")"])
0
ответ дан Wiktor Stribiżew 5 March 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: