Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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,我有一个python脚本,它大概有100行左右的正则表达式行,每行匹配某些单词 显然,每次运行脚本时,它都会消耗100%的cpu(我基本上会向它传递一个句子,它会返回找到的任何匹配单词) 我想将它们组合成大约4或5个不同的“已编译”正则表达式解析器,例如: >>> words = ('hello', 'good\-bye', 'red', 'blue') >>> pattern = re.compile('(' + '|'.join(words) + ')',

我有一个python脚本,它大概有100行左右的正则表达式行,每行匹配某些单词

显然,每次运行脚本时,它都会消耗100%的cpu(我基本上会向它传递一个句子,它会返回找到的任何匹配单词)

我想将它们组合成大约4或5个不同的“已编译”正则表达式解析器,例如:

>>> words = ('hello', 'good\-bye', 'red', 'blue')
>>> pattern = re.compile('(' + '|'.join(words) + ')', re.IGNORECASE)
我可以安全地用多少个词来表达这一点,这会有什么不同吗?现在,如果我在1000个随机句子上运行一个循环,它可能每秒处理10个句子,希望大幅提高这个速度,这样它就可以每秒处理500个句子(如果可能的话)

还有,有没有可能列出这样的清单

>>> words = ('\d{4,4}\.\d{2,2}\.\d{2,2}', '\d{2,2}\s\d{2,2}\s\d{4,4}\.')
>>> pattern = re.compile('(' + '|'.join(words) + ')', re.IGNORECASE)
>>> print pattern.findall("Today is 2010 11 08)

这里的算法基本上是每个句子的
O(N*M*L)
(其中
N
是句子的长度,
M
是要查找的单词数,
L
是要查找的最长单词)。使用正则表达式不会比使用find更快。它所提供的唯一功能是匹配第二个示例中的模式

如果你只想找到单词,a将是一个更好的方法。实施也非常简单:

TERMINAL = 'TERMINAL' # Marks the end of a word

def build(*words, trie={}):
    for word in words:
        pointer = trie
        for ch in word:
            pt = pt.setdefault(ch, {TERMINAL:False})
        pt[TERMINAL] = True
    return trie

def find(input, trie):
    results = []
    for i in range(len(input)):
        pt = trie
        for j in range(i, len(input)+1):
            if pt[TERMINAL]:
                results.append(input[i:j])
            if j >= len(input) or input[j] not in pt:
                break
            pt = pt[input[j]]
    return results
这将返回句子中trie中的所有单词。运行时间为
O(N*L)
,这意味着您可以添加任意数量的单词,而不会减慢算法