当前位置: 首页 > 面试题库 >

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

乜心思
2023-03-14
问题内容

正则表达式在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’转换为’退格’,而当您这样做时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中格式化字符串时,请考虑%运算符。

如果州包含州邮政编码列表,则应将其存储为字符串而不是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']

遗言

我了解您在学习一门新语言时可能会感到沮丧,但请花些时间为您的问题加上适当的标题。在此网站上,标题应以问号结尾,并提供有关该问题的特定详细信息。



 类似资料:
  • 问题内容: 我不明白为什么这个简单的正则表达式匹配不返回匹配对象。它返回None我在做什么错? 我完全是newby(昨天开始),想编写一个小程序来搜索文件夹树中的某些文件,打开这些文件并在这些文件中找到某些行,然后将这些行打印到一个新文件中。为了完成第一步,我想匹配os.walk返回的文件名,并使用某种模式进行匹配。因此,现在我正在检查正则表达式的工作方式,并且据我所知,以下代码应该匹配,但是当我

  • 我不知道为什么这个正则表达式不匹配。也许你能发现错误。 ficontents: 我想匹配>>>>>>客户端9462<<<<<捕获该号码,以及此后的所有内容,直到另一个客户端号码。所以我的第一个捕获是“9462”,第二个捕获是“Had a program exception;please check the error log”。 它使用JavaScript设置在regex101.com中工作得很好

  • 我们得到了一些这样的内容:

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 我有一个regex101正确工作的regex: 有2个匹配,如预期的。 现在我想用std的regex_token_iterator拆分相同的: 这可以很好地编译,但没有任何东西被打印到stdout。 我认为正则表达式必须以其他方式编写,你能指出我的错误吗?