使用常规表达式提取列表中一部分字符串

时间:2019-03-08 10:43:18

标签: python regex

与标题状态类似,我正在尝试使用正则表达式提取列表中字符串的一部分。 该列表包含多个如下所示的字符串:

 "[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 个答案:

答案 0 :(得分:2)

使用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 :(得分:2)

这是非常脆弱的,可能会破坏看起来不像您的数据的可怕数据,但是...

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 :(得分:1)

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

答案 3 :(得分:1)

我认为您正在寻找re.searchre.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']]

答案 4 :(得分:1)

尝试摆脱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是具有datarect属性的命名元组,因此您可以直接访问.data并获得所需的内容(可以看到其定义{{3 }}。

使用正则表达式来提取所需的内容是缓慢的,不可靠的并且很笨拙。

通过直接对对象进行操作,您在如何编写列表以及如何传递它们方面具有更大的灵活性。

您还保留了属性的原始类型。