我已经看过很多关于此的帖子,但我仍然无法让它发挥作用,我不知道为什么。
我所拥有的是一个相对简单的字符串,其中包含一些浮点和整数,例如:'2 1.000000000000000 1 1 0'
。我只想从中提取整数,在此示例中只提取2, 1, 1, 0
(而非1
后跟0
s。)
我知道我必须使用lookbehind
和lookahead
来排除.
之前或之后的数字。我可以成功找到前面有昏迷的数字,在上述情况下是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']
。有什么想法吗?我对正则表达式一般都是全新的,这只是让我不知所措。它应该工作,但事实并非如此。任何帮助将不胜感激。
答案 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+(?!\.)
中
-?
永远不会与短划线实际匹配,因为它不是断言的\.
国家必须在那里
该规则永远不会指向直接包含文字的方向的断言
除非文字包含在断言中。在这种情况下,无论如何它都是无序的,
所以-?
完全没用。