正则表达式在 Python 中的工作方式非常令人费解,每一秒都让我更加愤怒。这是我的问题:
我知道这给出了一个结果:
re.search(r'\bmi\b', 'grand rapids, mi 49505)
虽然这不是:
re.search('\bmi\b', 'grand rapids, mi 49505)
没关系。我明白了。现在,我有一个像这样生成的正则表达式:
regex = '|'.join(['\b' + str(state) + '\b' for state in states])
如果我现在执行 re.search(regex, 'grand rapids, mi 49505')
,它失败的原因与我的第二个 search()
示例失败的原因相同。
我的问题:有什么方法可以做我想做的事吗?
最佳答案
答案本身
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 < 3.0 中还有另一种表示法,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 中格式化字符串时,请考虑 % operator .
如果州包含州邮政编码列表,则应将其存储为字符串,而不是整数。在这种情况下,您可以跳过类型转换并进一步缩短它:
regex = r'\b%s\b' % r'\b|\b'.join(states)
最终,您可能根本不需要正则表达式。如果您只关心检查某个邮政编码是否在给定字符串中,您可以只使用 in
(检查某个项目是否在可迭代对象中,就像字符串是否在列表中一样) :
matches = [s for s in states if s in 'grand rapids, mi 49505']
最后一句话
我知道您在学习一门新语言时可能会感到沮丧,但请花时间给您的问题一个合适的标题。在本网站中,标题应以问号结尾,并提供有关问题的具体细节。
关于python - 为什么我的正则表达式与 r'string' 匹配但不匹配 'string' 使用 Python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909691/