Python在大型数据集上使用正则表达式替换字符串

时间:2018-08-22 13:37:37

标签: python regex performance loops

我最近开始使用re软件包来清理交易说明。

原始交易说明示例:

['bread','payment to facebook.com', 'milk', 'savings', 'amazon.com $xx ased lux', 'holiday_amazon']

对于表达式列表,我想用更好的表达式替换当前描述,例如如果其中一个列表条目包含'facebook'或'amazon'并以空格开头(或在字符串的开头),我想分别用单词'facebook'或'amazon'替换整个列表条目,即:

['bread', 'facebook', 'milk', 'savings', 'amazon', 'holiday_amazon']

由于我只想在单词facebook之前带有空格或单词开头的情况下选择它,因此我创建了表示此的正则表达式,例如(^ | \ s)facebook。请注意,这只是一个例子,实际上我也想过滤掉更复杂的表达式。

我总共有一个要替换的90个这样的表达式的数据框。

我当前的代码(以最小的可行示例为例)

import pandas as pd
import re

def specialCases(list_of_narratives, replacement_dataframe):
    # Create output array
    new_narratives = []
    special_cases_identifiers = replacement_dataframe["REGEX_TEST"]
    # For each string element of the list
    for memo in list_of_narratives:
        index_count = 0
        found_count = 0
        for i in special_cases_identifiers:
            regex = re.compile(i)
            if re.search(regex, memo.lower()) is not None:
                new_narratives.append(replacement_dataframe["NARRATIVE_TO"].values[index_count].lower())
                index_count += 1
                found_count += 1
                break
            else:
                index_count += 1
        if found_count == 0:
            new_narratives.append(memo.lower())
    return new_narratives

# Minimum example creation
list_of_narratives = ['bread','payment to facebook.com', 'milk', 'savings', 'amazon.com $xx ased lux', 'holiday_amazon']
list_of_regex_expressions = ['(^|\s)facebook', '(^|\s)amazon']
list_of_regex_replacements = ['facebook', 'amazon']
replacement_dataframe = pd.DataFrame({'REGEX_TEST': list_of_regex_expressions, 'NARRATIVE_TO': list_of_regex_replacements})

# run code
new_narratives = specialCases(list_of_narratives, replacement_dataframe)

但是,要替换超过100万个列表条目和90种不同的正则表达式(即len(list_of_regex_expressions)为90),这可能非常慢,这可能是由于double for循环所致。

有人可以帮助我提高这段代码的性能吗?

0 个答案:

没有答案