쉼표로 구분된 문자열을 목록으로 구문 분석하려면 어떻게 해야 합니까(주의사항)?
문제
다음과 같은 문자열을 사용할 수 있어야 합니다.
'''foo, bar, "one, two", three four'''
안으로:
['foo', 'bar', 'one, two', 'three four']
나는 해결책이 shlex 모듈과 관련될 것이라는 느낌을 받았습니다(#python의 힌트와 함께).
해결책
shlex 모듈 솔루션은 이스케이프된 따옴표, 하나의 따옴표가 다른 따옴표 및 쉘이 지원하는 모든 멋진 항목을 허용합니다.
>>> import shlex
>>> my_splitter = shlex.shlex('''foo, bar, "one, two", three four''', posix=True)
>>> my_splitter.whitespace += ','
>>> my_splitter.whitespace_split = True
>>> print list(my_splitter)
['foo', 'bar', 'one, two', 'three', 'four']
이스케이프된 따옴표 예:
>>> my_splitter = shlex.shlex('''"test, a",'foo,bar",baz',bar \xc3\xa4 baz''',
posix=True)
>>> my_splitter.whitespace = ',' ; my_splitter.whitespace_split = True
>>> print list(my_splitter)
['test, a', 'foo,bar",baz', 'bar \xc3\xa4 baz']
다른 팁
얼마나 복잡하게 만들고 싶은지에 따라 다릅니다.두 가지 이상의 인용 유형을 허용하시겠습니까?이스케이프된 따옴표는 어떻습니까?
구문은 Python 표준 라이브러리에서 지원되는 일반적인 CSV 파일 형식과 매우 유사합니다.
import csv
reader = csv.reader(['''foo, bar, "one, two", three four'''], skipinitialspace=True)
for r in reader:
print r
출력:
['foo', 'bar', 'one, two', 'three four']
HTH!
당신은 또한 CSV 기준 치수.시도하지는 않았지만 입력 데이터가 쉘 구문(shlex가 구문 분석하는 것)보다 CSV에 더 가까운 것 같습니다.
다음과 같이 할 수 있습니다.
>>> import re
>>> pattern = re.compile(r'\s*("[^"]*"|.*?)\s*,')
>>> def split(line):
... return [x[1:-1] if x[:1] == x[-1:] == '"' else x
... for x in pattern.findall(line.rstrip(',') + ',')]
...
>>> split("foo, bar, baz")
['foo', 'bar', 'baz']
>>> split('foo, bar, baz, "blub blah"')
['foo', 'bar', 'baz', 'blub blah']
나는 Python의 Regex 엔진에 대해 별로 익숙하지 않지만 여기서 정규 표현식이 여러분이 찾고 있는 것이라고 말하고 싶습니다.
지연 일치를 사용한다고 가정하면 배열에 넣을 수 있는 문자열에 대한 일치 집합을 얻을 수 있습니다.
예쁘지 않아도 된다면 다음과 같이 하면 됩니다.
def f(s, splitifeven):
if splitifeven & 1:
return [s]
return [x.strip() for x in s.split(",") if x.strip() != '']
ss = 'foo, bar, "one, two", three four'
print sum([f(s, sie) for sie, s in enumerate(ss.split('"'))], [])
제휴하지 않습니다 StackOverflow