正则表达式只删除某些表达式

问题描述 投票:1回答:2

我正在运行一个基于csv数据创建产品标签的程序。我正在努力的功能采用由数字组合(木板的宽度)和字符串(产品名称)组成的数据结构。我搜索的可能组合如下:

5 MAPLE PEPPER-ANTIQUE

3-1 / 4 MAPLE CUMIN-ANTIQUE

2-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)

我的表达或其他地方是否存在问题?谢谢

python regex python-3.x
2个回答
2
投票

re.sub()希望它的第一个论点是正则表达式。它适用于前两个,因为它们不包含任何在上下文中具有特殊含义的字符,但第三个包含+,这是特殊的。

实际上没有任何理由在那里使用正则表达式...常规字符串替换应该工作:

desc = desc.replace(size.group(), '')

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
© www.soinside.com 2019 - 2024. All rights reserved.