我今天正在将一些人工输入文本映射到部件名称,并且遇到了一个可能引起普遍关注的案例。这是人工输入的文字:
座位(Dis。)
光盘座
座椅
Seat(Suc。)
适用座位
要映射到的两个部分名称是SEAT, DISCHARGE
和SEAT, SUCTION
。我们还会将含糊不清的seats
映射到SEAT, DISCHARGE
。使用正则表达式的原因是我们可以预测未来的新案例,例如discharge seat
等。
所以目前我正在通过两个search()
调用解决这个问题,比如这个伪代码:
如果[Ss][Ee][Aa][Tt]
与输入名称匹配:
如果[Ss][Uu][Cc]
与输入名称匹配,则部分为SEAT, SUCTION
其他部分是SEAT, DISCHARGE
有没有更好的方法来进行这种映射?更好的意思是:更紧凑的代码,更容易调整以处理新案例,或更好地处理更多案例而无需修改代码。
答案 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])