элементы регулярных выражений в массиве на Python 2.7 - PullRequest
0 голосов
/ 27 сентября 2019

в Python2.7.У меня есть массив с объектами, такими как:

[{"TEMPLATE_NAME": "HP_LaserJet_P2055dn_USB_S29HDY6_HPLIP", 
"PRINTER_INFO": "HP LaserJet P2055dn", 
"PRINTER_LOCATION": "Локальный принтер", 
"DEVICE_URI": "hp:/usb/HP_LaserJet_P2055dn?serial=S29HDY6"}, 
{"TEMPLATE_NAME": "HP_LaserJet_P2055dn", 
"PRINTER_INFO": "HP LaserJet P2055dn", 
"PRINTER_LOCATION": "Локальный принтер", 
"DEVICE_URI": "usb://HP/LaserJet%20P2055dn?serial=S29HDY6"}]

Для любого совпадения аргумента и строки необходимо получить первый объект, найденный в массиве.Теперь это делается так:

ArgInListFindNewPrinters = next(name for name in ListFindNewPrinters if ArgPrinter in [name['PRINTER_INFO'], name['DEVICE_URI'], name['TEMPLATE_NAME'], name['PRINTER_LOCATION']])
print ArgInListFindNewPrinters

>> {"TEMPLATE_NAME": "HP_LaserJet_P2055dn_49A71E", "PRINTER_INFO": "HP HP LaserJet P2055dn", "PRINTER_LOCATION": "Локальный принтер", "DEVICE_URI": "dnssd://HP%20LaserJet%20P2055dn%20%5B49A71E%5D._pdl-datastream._tcp.local/"}

Недостаток этого метода в том, что он ищет полное совпадение аргумента и строки, но мне нужна любая запись без учета регистра.Пример: ArgPrinter = "LaserJe", ArgPrinter = "=S29HD"

Основная проблема - найти любые вхождения подстроки в строке.

========================================================================== Я нашел решение, но оно не очень практично, потому что перевод в строку требует изменения в кодировке:

ArgInListFindNewPrinters = next(name for name in ListFindNewPrinters if re.search(ArgPrinter, str(name), re.IGNORECASE))

Если есть более оптимальные способы сделать это, я будупризнателен.

1 Ответ

0 голосов
/ 27 сентября 2019

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

Используйте if x in string для сопоставления подстрок.

Может быть способ сделать этоболее приятно, но это работает:

ArgInListFindNewPrinters = next(name for name in ListFindNewPrinters
                                if ArgPrinter.lower() in name['PRINTER_INFO'].lower()
                                    or ArgPrinter.lower() in name['DEVICE_URI'].lower()
                                    or ArgPrinter.lower() in name['TEMPLATE_NAME'].lower()
                                    or ArgPrinter.lower() in name['PRINTER_LOCATION'].lower())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...