2

我一直在热切地搜索这个,但我无法真正缩小范围。我正在尝试解释一个值的 csv 文件,这是一种足够常见的行为。但我受到超过一千个值的惩罚,即引用和涉及逗号。我已经通过使用 csv 阅读器解决了这个问题,它从行中创建了一个数字列表,但是之后我必须选择逗号。

出于纯粹的学术原因,是否有更好的方法来使用正则表达式编辑字符串?从08/09/2010,"25,132","2,909",65008/09/2010,25132,2909,650

(如果你喜欢 Vim,基本上我想把 Python 放在这上面 :1,$s/"\([0-9]*\),\([0-9]*\)"/\1\2/g::D)

4

4 回答 4

2

使用csv模块进行第一阶段解析,正则表达式仅用于查看结果是否可以转换为数字。

import csv, re
num_re = re.compile('^[0-9]+[0-9,]+$')
for row in csv.reader(open('input_file.csv')):
  for el_num in len(row):
    if num_re.match(row[el_num]):
      row[el_num] = row[el_num].replace(',', '')

...尽管根本不使用正则表达式可能会更快:

for row in ([item.replace(',', '') for item in row]
            for row in csv.reader(open('input_file.csv'))):
  do_something_with_your(row)
于 2012-04-23T14:35:02.417 回答
1

我认为您正在寻找的是,假设逗号只会出现在数字中,并且这些条目将始终被引用:

import re

def remove_commas(mystring):
    return re.sub(r'"(\d+?),(\d+?)"', r'\1\2', mystring)

更新:在下面添加cdarke的评论,以下内容适用于任意长度的数字:

import re

def remove_commas_and_quotes(mystring):
    return re.sub(r'","|",|"', ',', re.sub(r'(?:(\d+?),)',r'\1',mystring))
于 2012-04-23T14:28:25.433 回答
0

Python 有一个正则表达式模块“re”:

http://docs.python.org/library/re.html

但是,在这种情况下,您可能需要考虑使用“分区”功能:

>>> s = 'some_long_string,"12,345",more_string,"56,6789",and_some_more'
>>> left_part,quote_mark,right_part = s.partition(")
>>> right_part
'12,345",more_string,"56,6789",and_some_more'
>>> number,quote_mark,remainder = right_part.partition(")
'12,345'

string.partition("character") 将字符串分成 3 部分,第一次出现的“字符”左侧的内容、“字符”本身和右侧的内容。

于 2012-04-23T14:29:45.947 回答
0

这是一个简单的正则表达式,用于从任意长度的数字中删除逗号:

re.sub(r'(\d+),?([\d+]?)',r'\1\2',mystring)
于 2013-06-05T06:12:27.523 回答