整数模式 - Python正则表达式

时间:2014-10-27 18:12:43

标签: python regex python-2.7

我已经看过很多关于此的帖子,但我仍然无法让它发挥作用,我不知道为什么。

我所拥有的是一个相对简单的字符串,其中包含一些浮点和整数,例如:'2 1.000000000000000 1 1 0'。我只想从中提取整数,在此示例中只提取2, 1, 1, 0(而非1后跟0 s。)

我知道我必须使用lookbehindlookahead来排除.之前或之后的数字。我可以成功找到前面有昏迷的数字,在上述情况下是0

import re
IntegerPattern = re.compile('-?(?<=\.)\d+(?!\.)')
a = '2   1.000000000000000       1   1 0'
IntegerPattern.findall(a)

将完全按照我的意愿返回['000000000000000']。但是,当我尝试找到 not 前面有. s的数字时,这不起作用:

import re
IntegerPattern = re.compile('-?(?<!\.)\d+(?!\.)')
a = '2   1.000000000000000       1   1 0'
IntegerPattern.findall(a)

返回['2', '00000000000000', '1', '1', '0']。有什么想法吗?我对正则表达式一般都是全新的,这只是让我不知所措。它应该工作,但事实并非如此。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

使用正则表达式

(\s|^)\d+(\s|$)

代码可以是

>>>  n='2 1.000000000000000 1 1 0'
>>> re.findall(r'(?:\s|^)\d+(?:\s|$)', n)
['2 ', ' 1 ', ' 0']

(\s*|^)匹配空格或字符串的开头

\d+匹配任意数量的数字

(\s*|$)匹配空格或字符串结尾

注意:\b不能用于分隔\d+.

中也包含\b

示例http://regex101.com/r/gP1nK0/1

修改

为什么正则表达式(?<!\.)\d+(?!\.)不起作用

现在问题是当使用断言围绕断言时,我们尝试不匹配.并且正则表达式尝试匹配.

当你写(?<!\.)时,正则表达式会找到一个可以成功的位置

就是说1.000000,正则表达式修正了第二个0位置,使得前一个位置不是.(为零),剩下的是00000因此获胜。因此它匹配它

要获得更清晰的视图,请查看此链接

http://regex101.com/r/gP1nK0/2

您可以看到1.000000000000000匹配从第二个0发生,使其成功

编辑1

更完美的正则表达式就像

(?:(?<=^)|(?<=\s))\d+(?=\s|$)

>>>n
'1 2 3 4.5'
>>> re.findall(r'(?:(?<=^)|(?<=\s))\d+(?=\s|$)', n)
['1', '2', '3']
>>> n='1 2 3 4'
>>> re.findall(r'(?:(?<=^)|(?<=\s))\d+(?=\s|$)', n)
['1', '2', '3', '4']

谢谢你指出那个

答案 1 :(得分:2)

我不会为正则表达式烦恼:

 s = '2   1.000000000000000       1   1 0'

 print [int(part) for part in s.split() if "." not in part]

使用基本的字符串操作通常要简单得多,或者正如那句老话:&34;我遇到了一个问题,我试图用正则表达式来解决。然后我有两个问题&#34;

答案 2 :(得分:1)

a = '-2   1.000000000000000       1   1 0'
print([x for x in a.split() if x[1:].isdigit() or x.isdigit()])
['-2', '1', '1', '0']

如果您想要.之前的数字:

a = '2   1.000000000000000       1   1 0'


print([x if x.isdigit() else x.split(".")[0] for x in a.split() ])
['2', '1', '1', '1', '0']

答案 3 :(得分:0)

发动机补偿匹配 它在左边放了\d,然后匹配。

这确保左侧没有数字shed -

 # (?<![.\d])\d+(?!\.)

 (?<! [.\d] )
 \d+ 
 (?! \. )

只是一个注释 - 在你的第一个模式-?(?<=\.)\d+(?!\.)-?永远不会与短划线实际匹配,因为它不是断言的\. 国家必须在那里 该规则永远不会指向直接包含文字的方向的断言 除非文字包含在断言中。在这种情况下,无论如何它都是无序的,
所以-?完全没用。