python - 为什么我的正则表达式与 r'string' 匹配但不匹配 'string' 使用 Python?

标签 python regex

正则表达式在 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/

相关文章:

javascript - CryptoJS 和 Pycrypto 协同工作

python - 如何在 python docx 中将修改的段落加粗

javascript - 正则表达式替换和追加字符串

javascript - 如何找到给定搜索词周围括号内的所有内容?

PHP Regex 如何精确匹配街道地址中的 2 或 3 位数字

python - PyGame 多点触控支持 (Windows 8)

python - redis-py 管道可以有多少个命令?

python - 有没有办法使用 Python 或某些 NLP 技术从字符串中删除不需要的空格? (不是尾随或额外的空格)

python - 反斜杠序列不匹配

具有可变字符数的 Python 负向后查找