用Python中的正则表达式清除数字中的逗号

用Python中的正则表达式清除数字中的逗号,python,regex,csv,Python,Regex,Csv,我一直在用谷歌搜索这一条,但我不能真正缩小范围。我试图解释一个csv文件的值,足够常见的行为。但我受到了超过一千个值的惩罚,即引用和包含逗号。我已经通过使用csv阅读器解决了这个问题,它从行中创建了一个数字列表,但之后我不得不选择逗号 纯粹出于学术原因,有没有更好的方法用正则表达式编辑字符串?从2010年9月8日,“25132”,“2909”,650到2010年9月8日201025132909650 (如果你喜欢Vim,基本上我想把Python放在这上面: :1,$s/“\([0-9]*\),\

我一直在用谷歌搜索这一条,但我不能真正缩小范围。我试图解释一个csv文件的值,足够常见的行为。但我受到了超过一千个值的惩罚,即引用和包含逗号。我已经通过使用csv阅读器解决了这个问题,它从行中创建了一个数字列表,但之后我不得不选择逗号

纯粹出于学术原因,有没有更好的方法用正则表达式编辑字符串?从
2010年9月8日,“25132”,“2909”,650
2010年9月8日201025132909650

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

我想你要找的是,假设逗号只出现在数字中,并且这些条目总是被引用:

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

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

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

>>> 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部分,填充在第一次出现的“character”的左侧,填充在右侧

第一阶段解析使用
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)

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

re.sub(r'(\d+),?([\d+]?)',r'\1\2',mystring)

是否要清除某些字段,这些字段的值中包含逗号,这样就不需要引用它们?如果是这样,你的例子是不正确的。您将
“25132”
转换为
25132
,但
“2909”
转换为
2909
。啊,哇!我的错,我想以后把它们都转换成整数,所以我需要一个纯数字串。你有什么特别的原因需要使用正则表达式吗?从字符串中删除逗号对于普通的字符串方法来说很简单。我认为正则表达式将是一种很好的方法,因为我有一个特定的模式要反对。我还只想从引号中的值中删除逗号(然后删除引号)。这并不是我所希望的,肯定是一个有趣的解决方案,但我希望将正则表达式与字符串组件匹配,并替换元素。@RobI是的,是的--CSV模块去掉引号,所以它只会产生
12345
而不是
“12345”
。我最喜欢这个答案(尽管不能删除我的-1)。但是我认为最后一行应该是:
row[el_num]=int(row[el_num].replace(“,”,“)
。尽管您可以完全去掉if语句;我说,这只需要一点点性能影响(如果有的话)就可以增加清晰度@RobI-Ooh,很好的回答——根据建议修补了最后一行。顺便说一句,我非常确定-1票实际上是可以收回的。@RobI没问题——我会整理我自己的评论,以使历史发挥作用。虽然@jdotjdot89回答了我的问题,但我认为这个答案给了我一个更好的方法!我继续我仍然在学习Python,所以我很确定我写的大部分东西都是可笑的非Python语言!尽管如此,请继续学习,谢谢!真的。你可能会在这里寻找一个递归正则表达式,它可以处理尽可能多的数字/逗号分组。我必须考虑一下。这正是你想要的我希望如此!你会怎么称呼这里使用的符号?基本上,我可以通过谷歌阅读更多关于:D@cdarke-对我来说不太管用-删除了太多的逗号。而且我没有足够接近它来进行调整。:)要使用@cdarke的正则表达式,你需要在它上面再做一个。当我用
'08/09/2010,“25132”,“2909”,650,“234235452”,“3344”,234'
测试他的时候,我得到的结果看起来像
'08/09/2010“25132”,“2909”,650“23425452”,“3344234'
。对于一个完全工作的版本,你应该尝试:
re.sub(r'”,|“,”,',“,”,re.sub(r'(?:(\d+),),),)r'\1',mystring))