希望同样的问题还没有得到回答(我看了但找不到)。
我有一个部分字符串列表:
date_parts = ['/Year', '/Month', '/Day',....etc. ]
我有一个字符串。例如
string1 = "Tag01/Source 01/Start/Year"
或者
string1 = "Tag01/Source 01/Volume"
除了使用 for 循环之外,检查字符串中是否包含任何 date_parts 字符串的最有效方法是什么?
对于信息,实际上 string1 实际上是许多字符串的另一个列表,我想删除这些包含 date_parts 列表中的字符串的任何字符串。
从部分字符串编译正则表达式。re.escape()
在它们包含正则表达式语言中的控制字符的情况下使用。
import re
date_parts = ['/Year', '/Month', '/Day']
pattern = re.compile('|'.join(re.escape(s) for s in date_parts))
然后使用re.search()
看是否匹配。
string1 = "Tag01/Source 01/Start/Year"
re.search(pattern, string1)
正则表达式引擎可能比原生 Python 循环更快。
对于您的特定用例,请考虑连接所有字符串,例如
all_string = '\n'.join(strings+[''])
然后,您可以在一次调用正则表达式引擎时一次性完成所有这些操作。
pattern = '|'.join(f'.*{re.escape(s)}.*\n' for s in date_parts)
strings = re.sub(pattern, '', all_string).split('\n')[:-1]
当然,这假设您的任何字符串都没有'\n'
. 如果需要,您可以选择一些不在您的字符串中的其他字符来加入和拆分。'\f'
例如,应该很少见。以下是您可以使用'@'
.
all_string = '@'.join(strings+[''])
pattern = '|'.join(f'[^@]*{re.escape(s)}[^@]*@' for s in date_parts)
strings = re.sub(pattern, '', all_string).split('@')[:-1]
如果这还不够快,您可以尝试使用更快的正则表达式引擎,例如rure。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句