答案本身
regex = '|'.join([r'\b' + str(state) + r'\b' for state in states])
这背后的原因是“r”前缀告诉Python不要分析你传递给它的字符串。如果你不在字符串前添加“r”,Python 会尝试将“\”前面的任何字符转换为特殊字符,以允许你输入换行符 (\n)、制表符 (\t) 等容易地。
当你这样做时'\b'
,你告诉 Python 创建一个字符串,分析它,并将 '\b' 转换为 'backspace',而当你这样做时r'\b'
,Python 只需存储“\”,然后存储“b”,这就是您想要的正则表达式。始终使用“r”作为正则表达式模式的字符串。
“r”表示法称为“原始字符串”,但这是一种误导,因为 Python 内部不存在原始字符串这样的东西。只需将其视为告诉 Python 避免过于聪明的一种方式即可。
Python u'string',这告诉 Python 将字符串存储为 unicode。您可以将两者结合起来:ur"é\n"
会将“\bé”存储为 unicode,而u"é\n"
将存储“é”,然后换行。
改进代码的一些方法:
regex = '|'.join(r'\b' + str(state) + r'\b' for state in states)
删除了多余的[]
。它告诉 Python 不要将正在生成的值列表存储在内存中。我们可以在这里执行此操作,因为我们不打算重复使用您正在创建的列表,因为您直接在您的join()
没有其他地方。
regex = '|'.join(r'\b%s\b' % state for state in states)
这将自动处理字符串转换,并且更短、更清晰。当您在 Python 中格式化字符串时,请考虑% 操作员.
如果 states 包含州邮政编码列表,则应存储为字符串,而不是 int。在这种情况下,您可以跳过类型转换并进一步缩短它:
regex = r'\b%s\b' % r'\b|\b'.join(states)
最终,您可能根本不需要正则表达式。如果您只关心检查邮政编码之一是否在给定字符串中,则可以使用in
(检查某个项目是否在可迭代对象中,就像字符串是否在列表中一样):
matches = [s for s in states if s in 'grand rapids, mi 49505']
遗言
我理解您在学习新语言时可能会感到沮丧,但请花点时间为您的问题提供适当的标题。在本网站中,标题应以问号结尾,并给出有关问题的具体细节。