我正在运行一个基于csv数据创建产品标签的程序。我正在努力的功能采用由数字组合(木板的宽度)和字符串(产品名称)组成的数据结构。我搜索的可能组合如下:
5 MAPLE PEPPER-ANTIQUE
3-1 / 4 MAPLE CUMIN-ANTIQUE2-1 / 4 + 4-1 / 4 MAPLE TIMBERWOLF
我的函数需要接收数据,从名称中分割宽度并将它们作为单独的变量返回,如下所示:
desc = row[1]
if filter.lower() in desc.lower():
size = re.search(r'(\d{1})(\-*)(\d{0,1})(\/*)(\d{0,2})(\+*)(\d{0,1})(\-*)(\d{0,1})(\/*)(\d{0,2})', desc)
if size:
# remove size from description
desc = re.sub(size.group(), '', desc)
size = size.group() # extract match from obj
else:
size = "None"
该功能与前两个样本一样,但是当遇到最后一个产品时,它会识别尺寸,但不会将其从描述中删除。下面的屏幕截图显示了我打印后的输出(尺寸+ \ n + desc)
我的表达方式或其他地方是否存在问题? 感谢
答案 0 :(得分:2)
re.sub()
期望它的第一个参数是正则表达式。它适用于前两个,因为它们不包含在上下文中具有特殊含义的任何字符,但第三个包含+
,这是特殊的。
实际上没有任何理由在那里使用正则表达式...常规字符串替换应该有效:
desc = desc.replace(size.group(), '')
答案 1 :(得分:1)
为什么要更换而不是简单地匹配你需要的东西?
import re
text = """5 MAPLE PEPPER-ANTIQUE
3-1/4 MAPLE CUMIN-ANTIQUE
2-1/4+4-1/4 MAPLE TIMBERWOLF""".split('\n')
print(text)
for t in text:
pattern = r'(?P<size>[0-9-+/]+) *(?P<species>[^0123456789]*)'
m = re.search(pattern,t)
print(m.group('size'))
print(m.group('species'))
输出:
5
MAPLE PEPPER-ANTIQUE
3-1/4
MAPLE CUMIN-ANTIQUE
2-1/4+4-1/4
MAPLE TIMBERWOLF
正则表达式:
r'(?P<size>[0-9-+/]+) *(?P<species>[^0123456789]*)'
2 named groups, between them 0-n spaces.
1st group only 0123456789-+/ allowed
2nd group any but 0123456789 allowed