2015-11-11 9 views
1

Я хочу немного узнать о регулярных выражениях. У меня есть строка, которая представляет идентификационный номер транспортного средства (VIN) в шестнадцатеричном коде.Регулярное выражение для конкретного шаблона VIN

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

Первый шаблон представляет следующие (пробелы и символы новой строки только для лучшей видимости):

49 02 01 00 00 00 xx 
49 02 02 xx xx xx xx 
49 02 03 xx xx xx xx 
49 02 04 xx xx xx xx 
49 02 05 xx xx xx xx 

Где xx являются байты, содержащие данные. Как вы можете видеть, данные состоят из 17 символов.

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

014 
0: 49 02 01 xx xx xx 
1: xx xx xx xx xx xx xx 
2: xx xx xx xx xx xx xx 

Где xx являются байты, содержащие данные. Как вы можете видеть, данные также состоят из 17 символов.

Я только хочу прочитать часть xx и объединить результат с строкой, которую я буду декодировать с помощью str.decode("hex"), чтобы получить мой VIN.

Итак, мой вопрос: можно ли все это упаковать в регулярном выражении, чтобы получить окончательные 17 байтов в результате?

+2

Да, это теоретически возможно, но я бы так не сделал. Во-первых, потому что мы говорим о байтах, который на самом деле не является текстом и поэтому будет сложным для соответствия с использованием регулярного выражения, которое ориентировано на текст (с возможной поддержкой локали). Протокол UDS, который вам нужно проанализировать, будет, скорее всего, проще проанализировать с использованием обычного анализатора или даже с использованием уже существующих библиотек. – Cilyan

+0

Итак, вы хотите одно регулярное выражение для всех форматов VIN? – pacholik

+0

Не поймите меня неправильно - мне уже удалось получить данные - меня просто интересует, можно ли получить его через регулярное выражение. Спасибо @Cilyan за указание на это. – Fr3ak1n0ut

ответ

-2

Пожалуйста, исправьте меня, если я что-то пропустил.

Я понимаю, что ваша строка 490201000000xx490202xxxxxxxx490203xxxxxxxx490204xxxxxxxx490205xxxxxxxx, и вы хотите извлечь из нее «x» в зависимости от позиции.

Я написал небольшой код, который будет обрабатываться в Javascript.

Для второго сценария вы можете просто удалить первые 6 символов?

var a = '490201000000xx490202xxxxxxxx490203xxxxxxxx490204xxxxxxxx490205xxxxxxxx'; 
var reg = /.{12}(.{2}).{6}(.{8}).{6}(.{8}).{6}(.{8})/g; 
var b = reg.exec(a); 
var c = b.splice(1, 4); 
var d = c.join(''); // d = 'xxxxxxxxxxxxxxxxxxxxxxxxxx' 
+1

этот вопрос в питоне. – d0nut

+0

OP сказал * Где xx - это байты, содержащие данные *. Данные не являются буквальными 'xx', это просто заполнители для шестнадцатеричного представления данных. –

+0

Получил. Я не был уверен, что у него были байты, преобразованные в строку. И я обвиняю в недостатке кофе для отсутствия части питона. –