在Python中如何仅从美元相关字段中删除美元符号和逗号

时间:2014-10-30 03:57:20

标签: python regex

我正在阅读一个包含大量列的大型文本文件,与美元相关而不是,并且我试图弄清楚如何仅使用$和字符来剥离美元字段。

所以说我有:

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()

有人有想法吗?

提前致谢。

8 个答案:

答案 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)

尝试以下正则表达式,然后将匹配的字符串替换为\1\2\3

\$(\d+(?:\.\d+)?)(?:(?:,(\d{2}))*(?:,(\d{3})))?

DEMO

答案 4 :(得分:0)

如果有必要,我试试这个正则表达式。

\$(\d+)[\,]*([\.]*\d*)

查看演示: http://regex101.com/r/wM0zB6/2

答案 5 :(得分:0)

听起来您正在同时处理整行文本。我认为您的第一个任务是将列拆分为数组或其他变量。一旦你做到了,你将货币串转换为数字的解决方案就不必担心其他领域了。

完成后,我认为执行此任务可能比使用正则表达式更简单。您可以从this SO question开始。

如果你真的想使用正则表达式,那么这个模式应该适合你:

\[$,]\g

Demo on regex101

用空字符串替换匹配项。如果你有其他种类的货币,那么这种模式就会变得复杂一些。

答案 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)

\$(?=(?:[^|]+,)|(?:[^|]+\.))

尝试使用empty string替换。使用re.M选项。查看演示。

http://regex101.com/r/gT6kI4/6