与标题状态类似,我正在尝试使用正则表达式提取列表中字符串的一部分。 该列表包含多个如下所示的字符串:
"[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)
答案 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.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']]
答案 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
是具有data
和rect
属性的命名元组,因此您可以直接访问.data
并获得所需的内容(可以看到其定义{{3 }}。
使用正则表达式来提取所需的内容是缓慢的,不可靠的并且很笨拙。
通过直接对对象进行操作,您在如何编写列表以及如何传递它们方面具有更大的灵活性。
您还保留了属性的原始类型。