有没有更好的方法来与正则表达式进行映射?

时间:2010-12-08 17:04:06

标签: python regex

我今天正在将一些人工输入文本映射到部件名称,并且遇到了一个可能引起普遍关注的案例。这是人工输入的文字:

座位(Dis。)

光盘座

座椅

Seat(Suc。)

适用座位

要映射到的两个部分名称是SEAT, DISCHARGESEAT, SUCTION。我们还会将含糊不清的seats映射到SEAT, DISCHARGE。使用正则表达式的原因是我们可以预测未来的新案例,例如discharge seat等。

所以目前我正在通过两个search()调用解决这个问题,比如这个伪代码:

如果[Ss][Ee][Aa][Tt]与输入名称匹配:

如果[Ss][Uu][Cc]与输入名称匹配,则部分为SEAT, SUCTION   其他部分是SEAT, DISCHARGE

有没有更好的方法来进行这种映射?更好的意思是:更紧凑的代码,更容易调整以处理新案例,或更好地处理更多案例而无需修改代码。

2 个答案:

答案 0 :(得分:4)

不要查找大写/小写字母的所有排列,而是尝试小写字符串并搜索小写字母。

linput = input.lower()
if 'seat' in linput:
    if 'suc' in linput:
        return 'SEAT, SUCTION'
    else:
        return 'SEAT, DISCHARGE'

我不确定在这种情况下是否需要正则表达式,除非您有更多需要匹配的字符串示例。但是,如果确实希望以这种方式执行,那么您还可以通过将re.I标志传递给任何正则表达式函数来使正则表达式调用不区分大小写。

答案 1 :(得分:1)

我会创建一个这样的列表:

products = [
    [ "seat",
       [
          ["suc", "SEAT, SUCTION"],
          [None, "SEAT, DISCHARGE"]
       ]
    ]
]    

然后执行搜索功能:

def search(text, products):
    for product in products:
        if re.search(product[0], text, re.IGNORECASE):
            for item in product[1]:
                if not item[0]:
                    return item[1]
                if re.search(item[0], text, re.IGNORECASE):
                    return item[1]

实际上,将列表实现为递归数据结构并将函数作为递归函数可能是值得的。也就是说,列表中的每个项目都是

形式
[ pattern, data ]

其中data是模式匹配时要返回的数据,或者是同一表单中的列表。然后搜索功能变为:

def search(text, items):
    for item in items:
        if item[0] == None or re.search(item[0], text, re.IGNORECASE):
            if type(item[1]) == type(str()):
                return item[1]
            return search(text, item[1])