كيف يمكنني تحليل بفواصل السلسلة إلى قائمة (التحذير)?

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

  •  02-07-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى أن تكون قادرة على اتخاذ سلسلة مثل:

'''foo, bar, "one, two", three four'''

إلى:

['foo', 'bar', 'one, two', 'three four']

لدي شعور (مع تلميحات من #python) أن الحل هو الذهاب إلى إشراك shlex وحدة.

هل كانت مفيدة؟

المحلول

على 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']

نصائح أخرى

ذلك يعتمد على كيفية تعقيدا كنت ترغب في الحصول على...هل تريد السماح أكثر من نوع واحد من الإقتباس.كيف هرب الاقتباس ؟

الجملة الخاصة بك تبدو كثيرا مثل شائع تنسيق ملف 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 وحدة نمطية.أنا لم أجربها لكن يبدو بيانات الإدخال هو أقرب إلى CSV من قذيفة جملة (وهو ما shlex يوزع).

هل يمكن أن تفعل شيئا مثل هذا:

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

أنا أقول العادية التعبير سيكون ما تبحث عنه هنا ، على الرغم من أنني لست رهيب مألوفة مع بايثون 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