Python 字符串列表和正则表达式列表,找到不匹配的字符串的干净方法?

标签 python regex

所以,我有一个正则表达式模式列表和一个字符串列表,我想做的是在这个字符串列表中说,是否有任何字符串不匹配任何正则表达式。

目前,我正在从两个字典中提取正则表达式,以及正则表达式要匹配的值:

我从两个词典中制作了两个列表,一个是模式,一个是键:

patterns = []
keys = []
for pattern, schema in patternproperties.items():
    patterns.append(pattern)
for key, value in value_obj.items():
    keys.append(key)

# Now work out if there are any non-matching keys

for key in keys:
    matches = 0
    for pattern in patterns:
        if re.match(pattern, key):
            matches += 1
    if matches == 0:
        print 'Key %s matches no patterns' %(key)

但这似乎非常低效。有人对此有更好的解决方案吗?

最佳答案

正则表达式针对搜索大文本 block 而不是小块序列进行了优化。因此,您可能需要考虑搜索 '\n'.join(keys) 而不是分别搜索每一个。

或者,或者,不是将循环从 Python 移动到正则表达式,而是将隐式“或”/“任何”位从 Python 移动到正则表达式:

pattern = re.compile('|'.join('({})'.format(p) for p in patterns))    
for key in keys:
    if not pattern.match(key):
        print 'Key %s matches no patterns' %(key)

另请注意,我使用了 re.compile。这可能无济于事,因为自动正则表达式缓存......但它永远不会有坏处,而且它通常也使代码更易于阅读。


来自一个快速的 timeit 测试,有一个简短的键列表和不同数量的简单模式:

patterns   original   alternation
2          76.1 us    42.4 us
3          109 us     42.5 us
4          143 us     43.3 us

因此,我们已经从模式数量的线性变为几乎恒定。

当然,这不会支持更复杂的模式,或者太多的模式。

关于Python 字符串列表和正则表达式列表,找到不匹配的字符串的干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621665/

相关文章:

regex - Dart RegExp:具有多种模式的单次通过?

regex - bash 正则表达式中的匹配组

java Matcher 返回整个匹配

python - 如何使用模块将 Python 回调公开给 Fortran

python - Tschuprow 关联错误 - 模块 'scipy.stats.contingency' 没有属性 'association'

python - pandas read_hdf 具有 'where' 条件限制?

python - 在 df 列上迭代不同的正则表达式模式

java - Java 中的 grep 命令等效项

Python 正则表达式前瞻超调模式

python - 如果遇到除零则返回零值