I've looked at several of the Stack Overflow posts with similar titles, and none of the accepted answers have done the trick for me.
I have a CSV file where each "cell" of data is delimited by a comma and is quoted (including numbers). Each line ends with a new line character.
Some text "cells" have quotation marks in them, and I want to use regex to find these, so that I can escape them properly.
Example line:
"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60"","AD"8"\n
I want to match just the " in E 60" and in AD"8, but not any of the other ".
What is a (preferably Python-friendly) regular expression that I can use to do this?
EDIT: Updated with regex from @sundance to avoid beginning of line and newline.
You could try substituting only quotes that aren't next to a comma, start of line, or newline:
import re
newline = re.sub(r'(?<!^)(?<!,)"(?!,|$)', '', line)
Rather than using regex, here's an approach that uses Python's string functions to find and escape only quotes between the left and rightmost quotes of a string.
It uses the .find() and .rfind() methods of strings to find the surrounding " characters. It then does a replacement on any additional " characters that appear inside the outer quotes. Doing it this way makes no assumptions about where the surrounding quotes are between the , separators, so it will leave any surrounding whitespace unaltered (for example, it leaves the '\n' at the end of each line as-is).
def escape_internal_quotes(item):
    left = item.find('"') + 1
    right = item.rfind('"')
    if left < right:
        # only do the substitution if two surrounding quotes are found
        item = item[:left] + item[left:right].replace('"', '\\"') + item[right:]
    return item
line = '"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60"","AD"8"\n'
escaped = [escape_internal_quotes(item) for item in line.split(',')]
print(repr(','.join(escaped)))
Resulting in:
'"0","0.23432","234.232342","data here dsfsd hfsdf","3/1/2016",,"etc","E 60\\"","AD\\"8"\n'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With