Python re模块 - 使用\ b和' - '的意外行为

时间:2017-03-15 20:45:56

标签: python regex

我正在测试(使用pythex

之间的正则表达式匹配
re.compile('''
              [ ]?
              (?P<element> [a-zA-Z])         
              [ ]+
              (?P<x_axis> \b-?[0-9]+[.][0-9]+\b)  # the first '\b' seems to be
                                                  # causing this issue
              ''', re.VERBOSE)

和字符串' C -1.97046278'。这导致找不到匹配项。

然后,当我尝试删除\b 时,找到了上述字符串的匹配项。

语法不正确吗?因为我一直在阅读 re 的文档,但没有发现任何提及。

要为我解释这种行为吗?

3 个答案:

答案 0 :(得分:1)

\b匹配单词字符和非单词字符。空格和-都是非单词字符,因此\b之间不匹配。

单词字符是字母,数字和下划线。非单词字符是其他所有字符。

此外,您需要使用由r''' ... '''分隔的原始字符串,以便将\b之类的转义序列传递给re模块,而不是作为字符串转义处理。

答案 1 :(得分:1)

这里有两个主要问题:

  • 字词边界\b 不明确,因为它们的含义取决于上下文。在这种情况下,如果数字前面有-\b-?[0-9]只会在-之前有字词char时匹配。您需要在 \b之后放置-? 。如果您删除此\b,您的正则表达式将开始匹配任何上下文中的数字,我怀疑您仍然只想匹配整个单词。
  • 您需要使用原始字符串文字声明正则表达式,以便将\b视为字边界而不是退格字符。

使用

import re
r=re.compile(r'''
              [ ]?
              (?P<element> [a-zA-Z])         
              [ ]+
              (?P<x_axis> -?\b[0-9]+[.][0-9]+\b)  # the first '\b' seems to be
                                                  # causing this issue
              ''', re.VERBOSE)
s = ' C -1.97046278'
print(r.findall(s))

查看online Python demo

答案 2 :(得分:0)

你当然需要:

re.compile(r'''
              [ ]?
              (?P<element> [a-zA-Z])         
              [ ]+
              (?P<x_axis> \b-?[0-9]+[.][0-9]+\b)  # the first '\b' seems to be
                                                  # causing this issue
              ''', re.VERBOSE)

请注意r来电中的compile()