我想过滤 python 中给定字符串的长度和呼吸
I want to filter the length and breath from a given string in python
我正在构建一个系统来计算打印图像的面积,以便从中制作账单。
我有这样的字符串-
"Canvas 36.5 X 48 piece-10"
"wallpaper 3"X27""(有时我们用"来表示英寸)
“横幅 49x87 -10”
"14 乙烯基 38 x 9.7"
“壁纸 3ftX2Ft PC-1”
诸如此类....
我想从 vba 中的给定数据中过滤浮点数和整数,以便计算特定区域。
就像在第一个字符串中一样,我想获取 36.5 的长度和 48 的呼吸以及 10 的长度等等
到目前为止我正在使用
findall(r"[-+]?\d*\.\d+|\d+",myStr)
获取所有整数和浮点数,我使用前两个变量作为长度和呼吸,但就像在“14 Vinyl 38 x 9.7”中一样,len = 38 和 breath=9.7 但算法显示 14 和 38,它是正确的正在路上,但我想得到它们之间基于 x 的 len 和 breath,这将是它们的正确符号化方式。
您可以使用以下代码。
代码:
import re
pictures = ['Canvas 36.5 X 48 piece-10',
'wallpaper 3"X27',
'Banner 49x87 -10',
'14 Vinyl 38 x 9.7',
'wallpaper 3ftX2Ft PC-1',
]
for pic in pictures:
size = re.search("(\d+\.?\d*)\s*(\D{0,2})[x]\s*(\d+\.?\d*)\s*(\D{0,2})", pic, re.IGNORECASE)
print(f"'{size.group(0)}' --> {size.groups()}")
输出:
'36.5 X 48 pi' --> ('36.5', '', '48', 'pi')
'3"X27' --> ('3', '"', '27', '')
'49x87 -' --> ('49', '', '87', '-')
'38 x 9.7' --> ('38', '', '9.7', '')
'3ftX2Ft' --> ('3', 'ft', '2', 'Ft')
size.group(1)
和 size.group(3)
包含宽度和高度尺寸。
这还允许您通过 size.group(2)
和 size.group(4)
评估相应的单位(例如 ft、"、cm?) - 如果有任何单位。但是请注意,您必须使用此正则表达式手动检查匹配项是否为有效单元(参见第一个和第三个示例)。
如果您在理解正则表达式时遇到问题,请告诉我。
另一种方法,看起来也应该按预期工作:
import re
def l_b_dims_piece(s):
"""Return a tuple of (length, breadth, dimensions, piece)"""
result = re.findall(r'([\d.]+)\s?(\D{0,2})\s?x\s?([\d.]+)\s??|(\d+)', s, re.IGNORECASE)
piece = 1
l = b = 0
dims = None
for l_, dims_, b_, piece_ in result:
if piece_ != '':
piece = piece_
else:
l, b, dims = l_, b_, dims_.replace('"', 'in', 1)
return l, b, dims, piece
用于测试的正则表达式游乐场:Link
我正在构建一个系统来计算打印图像的面积,以便从中制作账单。
我有这样的字符串-
"Canvas 36.5 X 48 piece-10"
"wallpaper 3"X27""(有时我们用"来表示英寸)
“横幅 49x87 -10”
"14 乙烯基 38 x 9.7"
“壁纸 3ftX2Ft PC-1”
诸如此类....
我想从 vba 中的给定数据中过滤浮点数和整数,以便计算特定区域。
就像在第一个字符串中一样,我想获取 36.5 的长度和 48 的呼吸以及 10 的长度等等
到目前为止我正在使用
findall(r"[-+]?\d*\.\d+|\d+",myStr)
获取所有整数和浮点数,我使用前两个变量作为长度和呼吸,但就像在“14 Vinyl 38 x 9.7”中一样,len = 38 和 breath=9.7 但算法显示 14 和 38,它是正确的正在路上,但我想得到它们之间基于 x 的 len 和 breath,这将是它们的正确符号化方式。
您可以使用以下代码。
代码:
import re
pictures = ['Canvas 36.5 X 48 piece-10',
'wallpaper 3"X27',
'Banner 49x87 -10',
'14 Vinyl 38 x 9.7',
'wallpaper 3ftX2Ft PC-1',
]
for pic in pictures:
size = re.search("(\d+\.?\d*)\s*(\D{0,2})[x]\s*(\d+\.?\d*)\s*(\D{0,2})", pic, re.IGNORECASE)
print(f"'{size.group(0)}' --> {size.groups()}")
输出:
'36.5 X 48 pi' --> ('36.5', '', '48', 'pi')
'3"X27' --> ('3', '"', '27', '')
'49x87 -' --> ('49', '', '87', '-')
'38 x 9.7' --> ('38', '', '9.7', '')
'3ftX2Ft' --> ('3', 'ft', '2', 'Ft')
size.group(1)
和 size.group(3)
包含宽度和高度尺寸。
这还允许您通过 size.group(2)
和 size.group(4)
评估相应的单位(例如 ft、"、cm?) - 如果有任何单位。但是请注意,您必须使用此正则表达式手动检查匹配项是否为有效单元(参见第一个和第三个示例)。
如果您在理解正则表达式时遇到问题,请告诉我。
另一种方法,看起来也应该按预期工作:
import re
def l_b_dims_piece(s):
"""Return a tuple of (length, breadth, dimensions, piece)"""
result = re.findall(r'([\d.]+)\s?(\D{0,2})\s?x\s?([\d.]+)\s??|(\d+)', s, re.IGNORECASE)
piece = 1
l = b = 0
dims = None
for l_, dims_, b_, piece_ in result:
if piece_ != '':
piece = piece_
else:
l, b, dims = l_, b_, dims_.replace('"', 'in', 1)
return l, b, dims, piece
用于测试的正则表达式游乐场:Link