我必须在文件中找到遵循特定格式的所有数字。格式如下:
每个数字都是正数或负数(符号可能存在也可能不存在,小数位前有一个或多个数字,小数点后有一个或多个数字)。可能没有小数位。每个数字前后都可以有空格。两个数字用逗号(,)或分号(;)或冒号(:)分隔。例如 (35.3,52.23; -623,623.62:-52,65)
所以在上面的例子中,我想列出六个数字。要搜索的数字列表在括号之间。到目前为止,我的代码看起来像这样:
def number_processing( file_location ):
""""""
import re
file_variable = open( file_location )
lines = file_variable.readlines()
numbers = re.compile(r'[(] *[+]?[-]?[0-9][0-9]*[.]+[,]+[;]+[0-9][0-9]* *[)]')
numbers_list = []
for line in lines:
for word in line.split(" "):
match = numbers.match(word)
if match:
numbers_list.append(match.group())
print numbers_list
非常感谢任何帮助!
答案 0 :(得分:6)
我认为您不需要使用str.split
,仅使用re.findall
怎么样?
>>> s = '35.3 , 52.23; -623, 623.62 : -52,65'
>>> re.findall(r'[-+]?\d+(?:\.\d*)?', s)
['35.3', '52.23', '-623', '623.62', '-52', '65']
编辑 只能在括号对内搜索,您可以先编写另一个正则表达式,然后重复使用上面的那个:
>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545 )'
>>> for s_ in re.findall(r'\(.*?\)', s):
... re.findall(r'[-+]?\d+(?:\.\d*)?', s_)
...
['23432.434', '32423', '-4343', '343']
['3244', '45445', '-4545']
要在列表理解中加入所有上述子列表:
>>> s = '(23432.434 , 32423, -4343; 343) 5555 (3244, 45445; -4545 )'
>>> pat1 = re.compile(r'\(.*?\)')
>>> pat2 = re.compile(r'[-+]?\d+(?:\.\d*)?')
>>> [x for s_ in re.findall(pat1, s) for x in re.findall(pat2, s_)]
['23432.434', '32423', '-4343', '343', '3244', '45445', '-4545']
答案 1 :(得分:0)
由于你已经按空间划分,正则表达式就像......
[(]?[+-]?\d+\.?\d+[,;:]?[)]?
(不确定你是否必须逃避括号......只需检查; D
和
[+] [ - ]? - 这是什么?你告诉你的正则表达式,+和 - 可能同时发生,但有可能一个或两个都不存在。
并且,整个正则表达式尝试同时识别两个单独的数字(如果我用逗号,分号和冒号得到你的意思),第二个就是整数。有很多测试用例,你不会得到你想要的东西。
答案 2 :(得分:0)
如果您只想使用正则表达式使用这些令牌,请运行全局表达式并以贪婪,简单的方式吃数字,短划线和小数点:
/[\d.-]+/
答案 3 :(得分:0)
如果您只是想找到所有数字,为什么不这样做:
re.findall(r'[+-\d.]', text)
并不担心无关的格式化?
(注意:这将匹配例如+2323.
,这是奇怪的输入,但Python可以处理它。如果你这样做
map(float, re.findall(r'[+-\d.]', text))
你仍会得到漂亮的花车清单。)