2016-01-23 47 views
0

我想写一个正则表达式脚本使用python和重新包的最后一个美元值从字符串中拆分。Python的正则表达式来拆分最后的美元值

这是我到目前为止有:

import re 
str = ['2 Apple pie $1.50 /each: $3.00', 
    'Corsair Vengeance 8GB DDR3 1600 MHz (PC3 12800) Desktop Memory $34.99'] 

[re.split("([$]\d+\.\d{2}?)",i) for i in str] 

输出:

[['2 Apple pie ', '$1.50', ' /each: ', '$3.00', ''], 
['Corsair Vengeance 8GB DDR3 1600 MHz (PC3 12800) Desktop Memory ','$34.99','']] 

所需的输出:

[['2 Apple pie $1.50 /each: ', '$3.00'], 
['Corsair Vengeance 8GB DDR3 1600 MHz (PC3 12800) Desktop Memory ','$34.99']] 

任何指针将帮助。提前致谢!

+1

'rsplit'呢? '[i.rsplit(“$”,1)for i in str]' – marcospereira

回答

2

我是能够使这项工作与你的例子:

import re 
str = ['2 Apple pie $1.50 /each: $3.00', 
    'Corsair Vengeance 8GB DDR3 1600 MHz (PC3 12800) Desktop Memory $34.99'] 

output = [re.match(r"(.+)(\$.*)$", x).groups() for x in str] 
print output 
# [('2 Apple pie $1.50 /each: ', '$3.00'), ('Corsair Vengeance 8GB DDR3 1600 MHz (PC3 12800) Desktop Memory ', '$34.99')] 

正则表达式利用了正则表达式贪婪的优势,所以通过让它在查找带有一些字符的$之前吞噬尽可能多的字符,我们可以隐式地告诉正则表达式引擎进行拆分在最后$

+1

我更喜欢这个答案,因为它看起来像OP试图使split与match()匹配对象上的事物一样。至少模式中的捕获组的使用情况有所表示。 – shmee

+0

谢谢,但@ marcospereira的答案应该是正确的答案。它简洁,干净,易于阅读。 – brittenb

+0

如果你能确定字符串的末尾总是一个价格,并且你不关心美元符号,那是真的 – shmee

0

你不能用一个零宽度匹配re模块分割,但它可能与regex module使用这个模式(?=[$][0-9.]+$)

[regex.split("(?V1)(?=[$][0-9.]+$)", i) for i in str] 

但是,您可以将美元符号之前使用的空间使得它与重模块:

[re.split(" (?=[$][0-9.]+$)",i) for i in str] 
+1

如果最后一个美元符号不在字符串的末尾,您的解决方案将失败。 'str.append(“这是一个价值34.50美元的字符串,随机美元符号为$ 45.20)”; [re.split(“(?= [$] [0-9。] + $)”,i)for i in str];'在最后一个元素中产生错误的结果。 – brittenb

+1

@brittenb:是的,但正如你所看到的,这些字符串在最后的价格总是*(否则这个问题没有意义)。 –