Python 有没有更好的方法使用正则表达式进行映射?
今天我将一些人工输入文本映射到零件名称,遇到了一个可能引起普遍兴趣的案例。以下是人工输入文本: 座位(Dis.) 阀瓣座 座位 座位(Suc.) 吸座 要映射到的两个零件名称是Python 有没有更好的方法使用正则表达式进行映射?,python,regex,Python,Regex,今天我将一些人工输入文本映射到零件名称,遇到了一个可能引起普遍兴趣的案例。以下是人工输入文本: 座位(Dis.) 阀瓣座 座位 座位(Suc.) 吸座 要映射到的两个零件名称是座椅,排放和座椅,吸入。我们还将把模糊的座位映射到座位,出院。使用正则表达式的原因是,我们可以预测未来会出现新的情况,例如出院座椅等 因此,目前我通过两个类似伪代码的search()调用来解决这个问题: 如果[Ss][Ee][Aa][Tt]与输入名称匹配: 如果[Ss][Uu][Cc]与输入名称匹配,则零件为吸入座 其他部
座椅,排放
和座椅,吸入
。我们还将把模糊的座位
映射到座位,出院
。使用正则表达式的原因是,我们可以预测未来会出现新的情况,例如出院座椅
等
因此,目前我通过两个类似伪代码的search()
调用来解决这个问题:
如果[Ss][Ee][Aa][Tt]
与输入名称匹配:
如果[Ss][Uu][Cc]
与输入名称匹配,则零件为吸入座
其他部分为座椅、排气口
有没有更好的方法来进行这种映射?更好的方法是:代码更紧凑,更容易调整以处理新的情况,或者在不修改代码的情况下更好地处理更多情况。与其查找所有大小写字母的排列,不如尝试将字符串小写并搜索小写版本
linput = input.lower()
if 'seat' in linput:
if 'suc' in linput:
return 'SEAT, SUCTION'
else:
return 'SEAT, DISCHARGE'
在这种情况下,我不确定正则表达式是否有保证,除非您有更多需要匹配的字符串示例。但是,如果您真的想这样做,还可以通过将re.I
标志传递给任何正则表达式函数,使正则表达式调用不区分大小写。与其查找所有大小写字母的排列,不如尝试将字符串小写并搜索小写版本
linput = input.lower()
if 'seat' in linput:
if 'suc' in linput:
return 'SEAT, SUCTION'
else:
return 'SEAT, DISCHARGE'
在这种情况下,我不确定正则表达式是否有保证,除非您有更多需要匹配的字符串示例。但是,如果您确实想这样做,还可以通过将re.I
标志传递给任何正则表达式函数,使正则表达式调用不区分大小写。我将创建如下列表:
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]
然后实现如下搜索功能:
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])
我会创建如下列表:
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]
然后实现如下搜索功能:
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])
在perl中,可以使用“i”选项使整个正则表达式不区分大小写。我不是python爱好者,但我会假设它是一样的,尽管我不知道如何添加选项。这将改变它,因此您可以在perl中搜索“seat”或“suc”,您可以使用“i”选项使整个正则表达式不区分大小写。我不是python爱好者,但我会假设它是一样的,尽管我不知道如何添加选项。这将改变它,所以您可以只搜索“seat”或“suc”是的,我的95%的映射最好直接用Python完成。我也在需要的地方简化了正则表达式。ThxYup,我的大约95%的映射最好直接用Python完成。我也在需要的地方简化了正则表达式。好主意,递归搜索是非常紧凑和强大的。事实上,使用它并将数据放入xml文件将减少只使用此函数所需的代码,因为逻辑是在数据中编码的。但是——我这样说,作为一个对XML的喜爱有时近乎无理的人——你可以将数据保存在一个.py文件中并导入它,而不是编写代码来解析和解释XML文件。好主意,递归搜索非常紧凑和强大。事实上,使用它并将数据放入xml文件将减少只使用此函数所需的代码,因为逻辑是在数据中编码的。但是——我作为一个对XML的喜爱有时近乎无理的人这样说——您可以将数据保存在一个.py文件中并导入它,而不是编写代码来解析和解释XML文件。