Использование регулярных выражений для извлечения части строки в списке - PullRequest
1 голос
/ 08 марта 2019

Как и в заголовках, я пытаюсь использовать регулярные выражения для извлечения части строки, которая находится в списке.Список содержит несколько строк, которые выглядят следующим образом:

 "[Decoded(data=b'FF01664817', rect=Rect(left=132, top=207, width=171,height=1))]", 
 "[Decoded(data=b'FF01664833', rect=Rect(left=227, top=128, width=-6, height=175))]"

Для небольшого контекста строки представляют собой матрицу данных, которую я декодировал с использованием cv2.Я хочу получить часть между ‘ ’ (содержимым матрицы данных) без остатка.

Мой подход выглядит так:

Data=[re.match(r"\'.*'\)",x[0]) for x in Data]

Но он возвращает только "Null" для каждой строки в списке, когда я печатаю свои данные.

Остальной код

import cv2
import numpy as np
import ctypes  
from pylibdmtx.pylibdmtx import decode
import csv
import re

img = cv2.imread('C:/Users/ML/Desktop/DataMatrix/Test2.jpg')
img2 = img

height, width, channels = img.shape

CROP_W_SIZE  = 8 
CROP_H_SIZE = 6

Data = []

for ih in range(CROP_H_SIZE ):
    for iw in range(CROP_W_SIZE ):

        x = int(width / CROP_W_SIZE * iw)
        y = int(height / CROP_H_SIZE * ih)
        h = int((height / CROP_H_SIZE))
        w = int((width / CROP_W_SIZE ))
       # print(x,y,h,w)

        img = img[y:y+h, x:x+w]

        Name = str(time.time()) 
        cv2.imwrite("C:/Users/ML/Desktop/DataMatrix/CROP/" + 'Crop' + str(x+y) +  ".jpg",img)
        img = img2

        Data.append(str(decode(cv2.imread('C:/Users/ML/Desktop/DataMatrix/CROP/'+ 'Crop' + str(x+y) +'.jpg'))))

Data=[re.match(r"\'.*'\)",x[0]) for x in Data]
print(Data)

Ответы [ 5 ]

2 голосов
/ 08 марта 2019

Это очень хрупко и, вероятно, будет ужасно ломаться с данными, которые не похожи на ваши, но ...

import re


def parse_key_value(s):
    return {
        m.group(1): m.group(2) or m.group(3)
        for m in re.finditer(
            r"([a-z]+)=(?:b\'(.+?)\'|(-?\d+?))[,)]", s
        )
    }


for x in [
    "[Decoded(data=b'FF01664817', rect=Rect(left=132, top=207, width=171, height=1))]",
    "[Decoded(data=b'FF01664833', rect=Rect(left=227, top=128, width=-6, height=175))]",
]:
    print(parse_key_value(x))

выходы

{'data': 'FF01664817', 'left': '132', 'top': '207', 'width': '171', 'height': '1'}
{'data': 'FF01664833', 'left': '227', 'top': '128', 'width': '-6', 'height': '175'}
2 голосов
/ 08 марта 2019

Используйте search() вместо match(). Последняя функция работает, только если ваше совпадение находится в начале строки:

import re

s = "[Decoded(data=b'FF01664817', rect=Rect(left=132, top=207, width=171, height=1))]"

print(re.search(r"'(.+?)'", s).group())
# FF01664817
1 голос
/ 08 марта 2019

Попробуйте избавиться от str и просто в цикле введите

Data.extend(decode(cv2.imread('C:/Users/ML/Desktop/DataMatrix/CROP/'+ 'Crop' + str(x+y) +'.jpg')))

.

А затем попробуйте выполнить:

Data = [x.data for x in Data]

Или в циклеВы можете просто сделать напрямую:

Data.extend(i.data for i in decode(cv2.imread(
    'C:/Users/ML/Desktop/DataMatrix/CROP/'+ 'Crop' + str(x+y) +'.jpg'
)))

И тогда Data будет содержать то, что вам нужно.

Decoded - это именованный кортеж с атрибутами data и rect, так что выможете просто получить прямой доступ к .data и получить то, что вам нужно (вы можете увидеть его определение здесь ).

Использование регулярных выражений для извлечения того, что вам нужно, медленно, ненадежно и довольно громоздко.

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

Вы также сохраняете оригинальный тип атрибута.

1 голос
/ 08 марта 2019

Я думаю, что вы ищете re.search или re.findall:

import re

v = ["[Decoded(data=b'FF01664817', rect=Rect(left=132, top=207, width=171, \
        height=1))]", "[Decoded(data=b'FF01664833', rect=Rect(left=227, \
        top=128, width=-6, height=175))]"]
se = [re.search(r"b'(.+)'", x).group(1) for x in v]
fa = [re.findall(r"b'(.+)'", x) for x in v]
print(se)
print(fa)

выходы:

['FF01664817', 'FF01664833']
[['FF01664817'], ['FF01664833']]

1 голос
/ 08 марта 2019

regex match () соответствует только началу строки.regex search () выполняет поиск по всей строке.

import re
list = ["[Decoded(data=b'FF01664817', rect=Rect(left=132, top=207, width=171, height=1))]",
        "[Decoded(data=b'FF01664833', rect=Rect(left=227, top=128, width=-6, height=175))]"]
data = [re.search(r''''.*''', x) for x in list]

вывод:

[<_sre.SRE_Match object; span=(15, 80), match="'FF01664817', rect=Rect(left=132, top=207, width=>, <_sre.SRE_Match object; span=(15, 81), match="'FF01664833', rect=Rect(left=227, top=128, width=>]

используйте метод .group () рядом, чтобы получить результат совпадения.

# FF01664817,FF01664833
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...