Подтвердить что ты не робот

Python Regex заменить

Эй, я пытаюсь найти регулярное выражение, чтобы сделать следующее.

Вот моя строка

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

Мне нужно разбить эту строку запятой. Хотя из-за запятой, используемой в полях цифровых данных, сплит работает неправильно. Поэтому я хочу удалить запятую в числах перед запуском разделения строки.

Спасибо.

4b9b3361

Ответ 1

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

Это заменит , внутри кавычек на ., и теперь вы можете просто использовать метод разделения строк.

Ответ 2

>>> 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']

Ответ 3

Другой способ сделать это с помощью регулярного выражения:

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

Ответ 4

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

Вы можете разобрать строку этого формата, используя 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]

Преимущество заключается в том, что вы анализируете, конвертируете и проверяете несколько строк. Обратите внимание, что int все преобразуются в int и дату в структуру datetime.

Ответ 6

Если вам нужно регулярное выражение, это должно сделать:

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

затем замените на:

"\1"

Он заменит любые номера с разделителями-запятыми в любом месте вашей строки эквивалентом только для числа, таким образом, изменив это:

Place, 08/09/2010, "15531", "548122909", 650

в это:

Place, 08/09/2010, "15531", "548122909", 650

Я уверен, что есть несколько отверстий, которые можно найти, и места, которые вам не нужны, и почему вы должны использовать парсер!

Удачи!