Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法使用正则表达式进行映射?_Python_Regex - Fatal编程技术网

Python 有没有更好的方法使用正则表达式进行映射?

Python 有没有更好的方法使用正则表达式进行映射?,python,regex,Python,Regex,今天我将一些人工输入文本映射到零件名称,遇到了一个可能引起普遍兴趣的案例。以下是人工输入文本: 座位(Dis.) 阀瓣座 座位 座位(Suc.) 吸座 要映射到的两个零件名称是座椅,排放和座椅,吸入。我们还将把模糊的座位映射到座位,出院。使用正则表达式的原因是,我们可以预测未来会出现新的情况,例如出院座椅等 因此,目前我通过两个类似伪代码的search()调用来解决这个问题: 如果[Ss][Ee][Aa][Tt]与输入名称匹配: 如果[Ss][Uu][Cc]与输入名称匹配,则零件为吸入座 其他部

今天我将一些人工输入文本映射到零件名称,遇到了一个可能引起普遍兴趣的案例。以下是人工输入文本:

座位(Dis.)

阀瓣座

座位

座位(Suc.)

吸座

要映射到的两个零件名称是
座椅,排放
座椅,吸入
。我们还将把模糊的
座位
映射到
座位,出院
。使用正则表达式的原因是,我们可以预测未来会出现新的情况,例如
出院座椅

因此,目前我通过两个类似伪代码的
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文件。