更高效的正则表达式

More efficient regular expression

我正在解析大约 200,000 个文档(每个约 1-3gb)以使用正则表达式删除所有非字母数字字符并匹配一些古老代码段的输入格式。每个 word/number 需要用 _ 分隔。

我已将它们拆分成单独的部分以使其有效,但我一直试图将这些表达式合并为一个,但没有成功。

如何将各个部分组合在一起?

组合表达式有哪些注意事项?

def clean_document(raw_input):
    no_more_etf = re.sub(r'[^\x00-\x7F]+', '', raw_input)
    no_more_non_utf = re.sub(r'[[=10=]0-13-7]', '', no_more_etf)
    no_more_spaces = re.sub('\s+', '_', no_more_non_utf.strip())
    almost_there = re.sub('[^0-9a-zA-Z]+', '_', no_more_spaces)
    clean_string = almost_there.lower()
    return clean_string

示例字符串: '"where is the Vehicles 我是一群隨機人物 "countries"=>"35,214" "refinement"=>"3" 我的书在哪里"I\'m a dirty array object"=>"" "category_ids"=>"2,5,7,8" "data_size_units"=>"", "delivery_formats"=>"1,4" "delivery_® ® ®methods"=>"1,2", "price_currencies"=>"1" , "trial_currencies"=>"1", "categories"=>"2,10 ,19", "Delivery_growth_units ® ® ®"=>"", "trial_duration_units"=>"6", 私の本はどこですか "collection_time_units"=>"", "strategies"=>"2,3 , 4,6", "processing_time_units"=>"", "delivery_frequency_units" =>"", "subscription_duration_units "=>"6" ® ® ® ģ ģ ģ - GPS Place-Visits for Delivery Vehicles'

您可以使用标准字符串的翻译方法(参见 string.translate 和 string.maketrans https://docs.python.org/2/library/string.html)执行所有这些替换(.strip() 除外)。

如果您不想使用翻译,则可以在函数外部准备替换模式的编译版本并在 re.sub() 调用中使用编译版本。此外,使用单个 re.sub() 而不是多个也会使事情变得更快。