我正在为一个项目解析超过 200 万个文本文件,需要您在正则表达式方面的帮助让它更快。我需要拆分单词,以便能够使用:
text_file = re.sub(r'\W+',' ', text_file)
然而,对于带连字符的词,我想删除连字符,但组合这个词(即非营利将是非营利而不是“非”、“利润”)。目前,我可以通过两次搜索和替换来做到这一点(一点也不理想)。最终输出将是 collections.Counter() 对象将使用的单词列表。
def mod1(text_file):
text_file = re.sub('\s*-\s*', '', text_file) # handling hyphens :( O(n)
text_file = re.sub(r'\W+',' ', text_file)
text_file = text_file.lower()
return(text_file)
除了正则表达式之外,任何更快的处理技巧也将不胜感激。谢谢。
请您参考如下方法:
使用lower()后,可以使用re.sub(r'([a-z])-([a-z])', r'\1\2', s ) 删除连字符。
然后 re.split(r'[^a-z]'),拆分单词。
s = s.lower()
s = re.sub(r'([a-z])-([a-z])', r'\1\2', s)
s = re.split(r'[^a-z]', s)
此解决方案可能(也可能不会)更快,取决于使用它的文本。它确实有一些可能的加速:
- 忽略数字允许使用
[a-z]而不是\w。 lower()首先被调用,允许re.sub()搜索一半的字母;即[a-z]而不是[A-Za-z]。- 假设连字符前后没有空格(因为通常应该是这种情况)允许用更快的
[a-z]-[a-z 替换'\s*-\s*']
