【问题标题】:matching list of substrings to a list of strings in Python将子字符串列表与 Python 中的字符串列表匹配
【发布时间】:2013-06-18 13:38:49
【问题描述】:

将子字符串列表与字符串列表匹配的pythonic方法是什么,如下所示:

if 'sub1' in str1 or 'sub2' in str1 or ... 'subN' in str1 or\
   'sub1' in str2 or 'sub2' in str2 or ... 'subN' in str2 or\
   ...
   'sub1' in strM or 'sub2' in strM or ... 'subN' in strM:

一种方法是将它们与列表理解结合起来,如下所示:

strList = [str1, str2, ..., strM]
subList = ['sub1', ..., 'subN']
if any(sub in str for sub in subList for str in strList):

有没有更好的方法,比如库函数,可以吸收其中一个维度?

非常感谢。

【问题讨论】:

  • 如果子字符串足够短(而不是太多),您可以将它们组合成正则表达式:sub1|sub2|sub3|...|subN
  • 根据字符串的数量和大小,将所有str[1..n]s 连接成一个大字符串,然后使用正则表达式或any(... in ...) 检查一次子字符串匹配可能会更快。
  • @TimPietzcker 这是一个有趣的想法。但我的具体情况的优势是子字符串是静态的,而字符串是动态的,所以我可以预先计算子字符串 RE 一次并在所有地方使用它。不过这个还是蛮原创的,非常感谢。

标签: python string-matching


【解决方案1】:

您可以将子字符串编译成正则表达式,并使用它来搜索每个字符串。如果您没有太多子字符串以至于 RE 超出内部限制,这可能是最有效的方法。

pattern = "|".join(re.escape(s) for s in subList)
crexp = re.compile(pattern)
if any(crexp.search(s) for s in strList):
    ...

【讨论】:

    【解决方案2】:

    this answer 中所述,正则表达式将是可行的方法,因为它们被建模为可以同时检查所有子字符串的 DFA。您可能应该阅读该答案,因为它非常深入。

    【讨论】:

    • Python的正则表达式引擎没有实现DFA引擎,但我支持你的结论。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2021-11-30
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多