쉼표로 구분된 문자열을 목록으로 구문 분석하려면 어떻게 해야 합니까(주의사항)?

StackOverflow https://stackoverflow.com/questions/118096

  •  02-07-2019
  •  | 
  •  

문제

다음과 같은 문자열을 사용할 수 있어야 합니다.

'''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('"'))], [])
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top