我正在阅读一个包含大量列的大型文本文件,与美元相关而不是,并且我试图弄清楚如何仅使用$和字符来剥离美元字段。
所以说我有:
a|b|c
$1,000|hi,you|$45.43
$300.03|$MS2|$55,000
其中a和c是美元字段而b不是。 输出必须是:
a|b|c
1000|hi,you|45.43
300.03|$MS2|55000
我认为正则表达式是可行的,但我无法弄清楚如何表达替代品:
f=open('sample1_fixed.txt','wb')
for line in open('sample1.txt', 'rb'):
new_line = re.sub(r'(\$\d+([,\.]\d+)?k?)',????, line)
f.write(new_line)
f.close()
有人有想法吗?
提前致谢。
答案 0 :(得分:4)
除非你真的想要使用正则表达式,否则我建议做一些简单,直接,通常易于理解的事情:
def convert_money(inval):
if inval[0] == '$':
test_val = inval[1:].replace(",", "")
try:
_ = float(test_val)
except:
pass
else:
inval = test_val
return inval
def convert_string(s):
return "|".join(map(convert_money, s.split("|")))
a = '$1,000|hi,you|$45.43'
b = '$300.03|$MS2|$55,000'
print convert_string(a)
print convert_string(b)
<强>输出强>
1000|hi,you|45.43
300.03|$MS2|55000
答案 1 :(得分:3)
一种简单的方法:
>>> import re
>>> exp = '\$\d+(,|\.)?\d+'
>>> s = '$1,000|hi,you|$45.43'
>>> '|'.join(i.translate(None, '$,') if re.match(exp, i) else i for i in s.split('|'))
'1000|hi,you|45.43'
答案 2 :(得分:0)
使用regexx
((?<=\d),(?=\d))|(\$(?=\d))
例如
import re
>>> x="$1,000|hi,you|$45.43"
re.sub( r'((?<=\d),(?=\d))|(\$(?=\d))', r'', x)
'1000|hi,you|45.43'
答案 3 :(得分:0)
答案 4 :(得分:0)
答案 5 :(得分:0)
听起来您正在同时处理整行文本。我认为您的第一个任务是将列拆分为数组或其他变量。一旦你做到了,你将货币串转换为数字的解决方案就不必担心其他领域了。
完成后,我认为执行此任务可能比使用正则表达式更简单。您可以从this SO question开始。
如果你真的想使用正则表达式,那么这个模式应该适合你:
\[$,]\g
用空字符串替换匹配项。如果你有其他种类的货币,那么这种模式就会变得复杂一些。
答案 6 :(得分:0)
定义黑名单并检查字符是否在其中,这是一种简单的方法:
blacklist = ("$", ",") # define characters to remove
with open('sample1_fixed.txt','wb') as f:
for line in open('sample1.txt', 'rb'):
clean_line = "".join(c for c in line if c not in blacklist)
f.write(clean_line)
答案 7 :(得分:0)