Python正则表达式取代

时间:2011-11-17 19:11:04

标签: python regex

嘿我正在试图找出一个正则表达式来执行以下操作。

这是我的字符串

Place,08/09/2010,"15,531","2,909",650

我需要用逗号分隔这个字符串。虽然由于数字数据字段中使用了逗号,但拆分无法正常工作。所以我想在运行拆分字符串之前删除数字中的逗号。

感谢。

6 个答案:

答案 0 :(得分:49)

new_string = re.sub(r'"(\d+),(\d+)"', r'\1.\2', original_string)

这将使用,替换引号内的.,现在您可以使用字符串拆分方法。

答案 1 :(得分:26)

>>> from StringIO import StringIO
>>> import csv
>>> r = csv.reader(StringIO('Place,08/09/2010,"15,531","2,909",650'))
>>> r.next()
['Place', '08/09/2010', '15,531', '2,909', '650']

答案 2 :(得分:1)

直接使用正则表达式的另一种方法:

>>> import re
>>> data = "Place,08/09/2010,\"15,531\",\"2,909\",650"
>>> res = re.findall(r"(\w+),(\d{2}/\d{2}/\d{4}),\"([\d,]+)\",\"([\d,]+)\",(\d+)", data)
>>> res
[('Place', '08/09/2010', '15,531', '2,909', '650')]

答案 3 :(得分:1)

您可以使用pyparsing解析该格式的字符串:

import pyparsing as pp
import datetime as dt

st='Place,08/09/2010,"15,531","2,909",650'

def line_grammar():
    integer=pp.Word(pp.nums).setParseAction(lambda s,l,t: [int(t[0])])
    sep=pp.Suppress('/')
    date=(integer+sep+integer+sep+integer).setParseAction(
              lambda s,l,t: dt.date(t[2],t[1],t[0]))
    comma=pp.Suppress(',')
    quoted=pp.Regex(r'("|\').*?\1').setParseAction(
              lambda s,l,t: [int(e) for e in t[0].strip('\'"').split(',')])
    line=pp.Word(pp.alphas)+comma+date+comma+quoted+comma+quoted+comma+integer
    return line

line=line_grammar()
print(line.parseString(st))
# ['Place', datetime.date(2010, 9, 8), 15, 531, 2, 909, 650]

优点是您可以在几行中解析,转换和验证。请注意,整数都将转换为整数,日期转换为日期时间结构。

答案 4 :(得分:0)

a = """Place,08/09/2010,"15,531","2,909",650""".split(',')
result = []
i=0
while i<len(a):
    if not "\"" in a[i]:
        result.append(a[i])
    else:
        string = a[i]
        i+=1
        while True:
            string += ","+a[i]
            if "\"" in a[i]:
                break
            i+=1
        result.append(string)
    i+=1
print result

结果:
['Place', '08/09/2010', '"15,531"', '"2,909"', '650']
除非你绝对需要,否则不是正则表达式的忠实粉丝

答案 5 :(得分:-1)

如果您需要正则表达式解决方案,则应执行以下操作:

r"(\d+),(?=\d\d\d)"

然后替换为:

"\1"

它会将字符串中任何位置的逗号分隔数字替换为仅限数字的数字,从而转而:

  

放置的08/09/2010年, “15531”, “548122909”,650

进入这个:

  

放置的08/09/2010年, “15531”, “548122909”,650

我确信有一些漏洞可以找到并且你不希望这样做的地方,这就是你应该使用解析器的原因!

祝你好运!