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