2017-03-15 37 views
1

的Python重新模块 - 以 B和意外行为 ' - '

和字符串 ' C -1.97046278'之间
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) 

测试(使用pythex)一个正则表达式的匹配。这导致找不到匹配。

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

语法不正确?因为我一直在阅读关于的文档,并且没有发现任何提及。

小心为我解释这种行为?

回答

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) 

注意rcompile()通话。

1

\b匹配单词字符和非单词字符。空格和-都是非单词字符,所以\b不会在它们之间匹配。

单词字符是字母,数字和下划线。非单词字符是其他的一切。

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

+2

这只是问题的一部分 - 因为OP不使用raw字符串表示'\ B'是文字退格字符。 –

1

这里有两个主要问题:

  • 字边界\b暧昧他们的意思是上下文相关的。在这种情况下,如果数字前有-,则只有在-之前存在字符字符时,\b-?[0-9]才会匹配。您需要在-?之后放置\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