【问题标题】:Do regular expressions from the re module support word boundaries (\b)?re 模块中的正则表达式是否支持单词边界 (\b)?
【发布时间】:2011-04-29 01:04:41
【问题描述】:

在尝试学习更多关于正则表达式的知识时,一个教程建议您可以使用\b 来匹配单词边界。但是,Python 解释器中的以下 sn-p 无法按预期工作:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

如果有任何匹配,它应该是一个匹配对象,但它是None

Python 不支持\b 表达式还是我用错了?

【问题讨论】:

  • 这将起作用:re.search(r"\btwo\b", x)
  • 你为什么不使用“原始”字符串? r"\btwo\b"?
  • 人们是often confused 关于\b
  • Yes Python 可以,您只需要原始字符串 r'\b' 就可以转义字符。 (或者双重转义它\\b,这是 yukky)

标签: python regex word-boundaries


【解决方案1】:

你在你的代码中should be using raw strings

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

还有,你为什么不试试

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

输出:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

【讨论】:

  • 有趣,感谢您的工作示例。您对为什么我选择的方法不起作用有任何见解吗?这两种方法应该是相同的,只是在你的方法中你只编译一次。
  • @darren:看我的最后一个例子,它只是改进了你所做的。我提供了原始字符串进行搜索。
  • 啊,在你和 Bolo 的建议之后,这是因为我没有使用原始字符串。谢谢!
  • -1:向后。原始字符串应该是第一个。使用字符串 % 替换构建 re 表达式的另一项业务是一个坏切线,与这个特定问题无关。
  • 错误答案。代码有效,但没有任何解释。
【解决方案2】:

只是为了明确解释为什么 re.search("\btwo\b", x) 不起作用,这是因为 Python 字符串中的 \b 是退格字符的简写。

print("foo\bbar")
fobar

所以模式"\btwo\b" 正在寻找一个退格,然后是two,然后是另一个退格,而您正在搜索的字符串 (x = 'one two three') 没有。

要允许re.search(或compile)将序列\b 解释为单词边界,请转义反斜杠("\\btwo\\b")或使用原始字符串创建您的模式(r"\btwo\b")。

【讨论】:

    【解决方案3】:

    Python 文档

    https://docs.python.org/2/library/re.html#regular-expression-syntax

    \b

    匹配空字符串,但只匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字、非下划线字符表示。请注意,正式地,\b 被定义为 \w 和 \W 字符之间的边界(反之亦然),或 \w 和字符串的开头/结尾之间的边界,因此被视为字母数字的精确字符集取决于关于 UNICODE 和 LOCALE 标志的值。例如,r'\bfoo\b' 匹配 'foo'、'foo.'、'(foo)'、'bar foo baz' 但不匹配 'foobar' 或 'foo3'。在字符范围内,\b 表示退格字符,以与 Python 的字符串文字兼容。

    【讨论】:

      【解决方案4】:

      这将起作用:re.search(r"\btwo\b", x)

      当您在 Python 中编写 "\b" 时,它是单个字符:"\x08"。要么像这样转义反斜杠:

      "\\b"
      

      或者像这样写一个原始字符串:

      r"\b"
      

      【讨论】:

      • 这真的帮助了我......我在 pyspark rlike 正则表达式中苦苦挣扎,无法弄清楚为什么 \b (单词边界)不起作用。谢谢
      • 谢谢,我也被这个抓住了。但是为什么 \d 在没有原始字符串的情况下可以正常工作,而 \b 却不行?
      • 双反斜杠观察真的让我摆脱了困境。谢谢。
      • @QuinnComendant 因为 \d 不是转义序列,请参阅docs.python.org/3/reference/…中的表格
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多