স্বীকৃত shlex
পদ্ধতির সাথে প্রধান সমস্যাটি হ'ল এটি উদ্ধৃত সাবস্ট্রিংগুলির বাইরে পালানো অক্ষরগুলিকে উপেক্ষা করে না এবং কিছু কোণার ক্ষেত্রে কিছুটা অপ্রত্যাশিত ফলাফল দেয়।
আমার নীচের ব্যবহারের কেস রয়েছে, যেখানে আমার একটি বিভক্ত ফাংশন প্রয়োজন যা ইনপুট স্ট্রিংগুলিকে বিভক্ত করে যেগুলি সিঙ্গল-কোটড বা ডাবল-কোটড সাবস্ট্রিংগুলি সংরক্ষণ করা হয়, যেমন একটি স্ট্রিংয়ের মধ্যে উদ্ধৃতিগুলি এড়াতে সক্ষম হয়। অব্যক্ত স্ট্রিংয়ের মধ্যে উদ্ধৃতিগুলি অন্য কোনও চরিত্রের থেকে আলাদাভাবে আচরণ করা উচিত নয়। প্রত্যাশিত আউটপুট সহ কয়েকটি উদাহরণ পরীক্ষার কেস:
ইনপুট স্ট্রিং | প্রত্যাশিত আউটপুট
===============================================
'এবিসি ডিএফ' | ['এবিসি', 'ডিএফ']
"abc \\ s Def" | ['এবিসি', '' এস ',' ডিএফ ']
'"এবিএফ ডিএফ" ঘি' | ['এবিসি ডিএফ', 'জিআই]]
"'abc Def' ghi" | ['এবিসি ডিএফ', 'জিআই]]
'"abc \\" Def "ghi' | ['abc" Def', 'ghi']
"'abc \\' Def 'ghi" | ["এবিসি 'ডিএফ",' জিআই ']
"'abc \\ s Def' ghi" | ['abc \\ s Def', 'ghi']
'"abc \\ s Def" ghi' | ['abc \\ s Def', 'ghi']
'"" পরীক্ষা' | ['', 'পরীক্ষা']
"'' পরীক্ষা" | ['', 'পরীক্ষা']
"abc'def" | [ "Abc'def"]
"abc'def '" | [ "Abc'def '"]
"abc'def 'ghi" | ["abc'def '",' ghi ']
"abc'def'ghi" | [ "Abc'def'ghi"]
'abc "def' | ['abc" Def']
'abc "def"' | [ 'ABC "Def"']
'abc "def" ghi' | ['abc "def" ",' ghi ']
'abc "def" ghi' | [ 'ABC "Def" GHI']
"r'AA 'r'। * _ xyz $ '" | ["r'AA '", "আর'। * _ xyz $ '"]
আমি একটি স্ট্রিং বিভক্ত করতে নিম্নলিখিত ফাংশনটির সাথে শেষ করেছি যাতে সমস্ত ইনপুট স্ট্রিংয়ের জন্য প্রত্যাশিত আউটপুট ফলাফল হয়:
import re
def quoted_split(s):
def strip_quotes(s):
if s and (s[0] == '"' or s[0] == "'") and s[0] == s[-1]:
return s[1:-1]
return s
return [strip_quotes(p).replace('\\"', '"').replace("\\'", "'") \
for p in re.findall(r'"(?:\\.|[^"])*"|\'(?:\\.|[^\'])*\'|[^\s]+', s)]
নিম্নলিখিত পরীক্ষার অ্যাপ্লিকেশনটি অন্যান্য পদ্ধতির ফলাফলগুলি ( shlex
এবং csv
এখনই) এবং কাস্টম বিভাজন বাস্তবায়নের পরীক্ষা করে:
#!/bin/python2.7
import csv
import re
import shlex
from timeit import timeit
def test_case(fn, s, expected):
try:
if fn(s) == expected:
print '[ OK ] %s -> %s' % (s, fn(s))
else:
print '[FAIL] %s -> %s' % (s, fn(s))
except Exception as e:
print '[FAIL] %s -> exception: %s' % (s, e)
def test_case_no_output(fn, s, expected):
try:
fn(s)
except:
pass
def test_split(fn, test_case_fn=test_case):
test_case_fn(fn, 'abc def', ['abc', 'def'])
test_case_fn(fn, "abc \\s def", ['abc', '\\s', 'def'])
test_case_fn(fn, '"abc def" ghi', ['abc def', 'ghi'])
test_case_fn(fn, "'abc def' ghi", ['abc def', 'ghi'])
test_case_fn(fn, '"abc \\" def" ghi', ['abc " def', 'ghi'])
test_case_fn(fn, "'abc \\' def' ghi", ["abc ' def", 'ghi'])
test_case_fn(fn, "'abc \\s def' ghi", ['abc \\s def', 'ghi'])
test_case_fn(fn, '"abc \\s def" ghi', ['abc \\s def', 'ghi'])
test_case_fn(fn, '"" test', ['', 'test'])
test_case_fn(fn, "'' test", ['', 'test'])
test_case_fn(fn, "abc'def", ["abc'def"])
test_case_fn(fn, "abc'def'", ["abc'def'"])
test_case_fn(fn, "abc'def' ghi", ["abc'def'", 'ghi'])
test_case_fn(fn, "abc'def'ghi", ["abc'def'ghi"])
test_case_fn(fn, 'abc"def', ['abc"def'])
test_case_fn(fn, 'abc"def"', ['abc"def"'])
test_case_fn(fn, 'abc"def" ghi', ['abc"def"', 'ghi'])
test_case_fn(fn, 'abc"def"ghi', ['abc"def"ghi'])
test_case_fn(fn, "r'AA' r'.*_xyz$'", ["r'AA'", "r'.*_xyz$'"])
def csv_split(s):
return list(csv.reader([s], delimiter=' '))[0]
def re_split(s):
def strip_quotes(s):
if s and (s[0] == '"' or s[0] == "'") and s[0] == s[-1]:
return s[1:-1]
return s
return [strip_quotes(p).replace('\\"', '"').replace("\\'", "'") for p in re.findall(r'"(?:\\.|[^"])*"|\'(?:\\.|[^\'])*\'|[^\s]+', s)]
if __name__ == '__main__':
print 'shlex\n'
test_split(shlex.split)
print
print 'csv\n'
test_split(csv_split)
print
print 're\n'
test_split(re_split)
print
iterations = 100
setup = 'from __main__ import test_split, test_case_no_output, csv_split, re_split\nimport shlex, re'
def benchmark(method, code):
print '%s: %.3fms per iteration' % (method, (1000 * timeit(code, setup=setup, number=iterations) / iterations))
benchmark('shlex', 'test_split(shlex.split, test_case_no_output)')
benchmark('csv', 'test_split(csv_split, test_case_no_output)')
benchmark('re', 'test_split(re_split, test_case_no_output)')
আউটপুট:
shlex
[ঠিক আছে] এবি ডিএফ -> ['এবিসি', 'ডিএফ']
[ফেইল] আবসি ab গুলি ডিফ -> ['এবিসি', 'এস', 'ডিএফ']
[ঠিক আছে] "এবিসি ডিএফ" গি -> ['এবিসি ডিএফ', 'গি']
[ঠিক আছে] 'এবিসি ডিএফ' গি -> ['এবিসি ডিএফ', 'গি']
[ঠিক আছে] "abc \" Def "ghi -> ['abc" Def ",' ghi ']
[FAIL] 'abc \' Def 'ghi -> ব্যতিক্রম: কোনও সমাপ্ত উদ্ধৃতি নেই
[ঠিক আছে] 'এবি \ s ডিফ' গি -> ['এবি \\ সি ডিফ', 'গি']
[ঠিক আছে] "abc \ s Def" ghi -> ['abc \\ s Def', 'ghi']
[ঠিক আছে] "" পরীক্ষা -> ['', 'পরীক্ষা']
[ঠিক আছে] '' পরীক্ষা -> ['', 'পরীক্ষা']
[FAIL] abc'def -> ব্যতিক্রম: সমাপ্তির উদ্ধৃতি নেই
[FAIL] abc'def '-> [' abcdef ']
[FAIL] abc'def 'ghi -> [' abcdef ',' ghi ']
[FAIL] abc'def'ghi -> ['abcdefghi']
[FAIL] abc "def -> ব্যতিক্রম: কোনও সমাপ্ত উদ্ধৃতি নেই
[FAIL] abc "def" -> ['abcdef']
[FAIL] এবিসি "ডিফ" ঘি -> ['আবদাদেফ', 'গি']
[FAIL] abc "Def" ghi -> ['abcdefghi']
[FAIL] r'AA 'r'। * _ Xyz $ '-> [' rAA ',' r। * _ Xyz $ ']
CSV
[ঠিক আছে] এবি ডিএফ -> ['এবিসি', 'ডিএফ']
[ঠিক আছে] abc \ s Def -> ['এবিসি', '\\ s', 'ডিফ']
[ঠিক আছে] "এবিসি ডিএফ" গি -> ['এবিসি ডিএফ', 'গি']
[FAIL] 'abc Def' ghi -> ["'abc", "Def" ",' ghi ']
[FAIL] "abc \" Def "ghi -> ['abc \\', 'Def"', 'ghi']
[FAIL] 'abc \' Def 'ghi -> ["' abc", "\\" "," Def "", 'ghi']
[FAIL] 'abc \ s Def' ghi -> ["'abc",' \\ s ', "Def" ",' ghi ']
[ঠিক আছে] "abc \ s Def" ghi -> ['abc \\ s Def', 'ghi']
[ঠিক আছে] "" পরীক্ষা -> ['', 'পরীক্ষা']
[FAIL] '' পরীক্ষা -> ["'" ",' পরীক্ষা ']
[ঠিক আছে] abc'def -> ["abc'def"]
[ঠিক আছে] abc'def '-> ["abc'def'"]
[ঠিক আছে] abc'def 'ghi -> ["abc'def'", 'ghi']
[ঠিক আছে] আবদ'এফ'ঘি -> ["আবদ'দেফ'গি]]
[ঠিক আছে] abc "Def -> ['abc" Def']
[ঠিক আছে] abc "Def" -> ['abc "def"']
[ঠিক আছে] abc "Def" ghi -> ['abc "Def" ",' ghi ']
[ঠিক আছে] abc "Def" ghi -> ['abc "Def" ghi']
[ঠিক আছে] r'AA 'আর'। * _ Xyz $ '-> ["r'AA'", "আর '*
পুনরায়
[ঠিক আছে] এবি ডিএফ -> ['এবিসি', 'ডিএফ']
[ঠিক আছে] abc \ s Def -> ['এবিসি', '\\ s', 'ডিফ']
[ঠিক আছে] "এবিসি ডিএফ" গি -> ['এবিসি ডিএফ', 'গি']
[ঠিক আছে] 'এবিসি ডিএফ' গি -> ['এবিসি ডিএফ', 'গি']
[ঠিক আছে] "abc \" Def "ghi -> ['abc" Def ",' ghi ']
[ঠিক আছে] 'abc \' Def 'ghi -> ["abc' Def", 'ghi']
[ঠিক আছে] 'এবি \ s ডিফ' গি -> ['এবি \\ সি ডিফ', 'গি']
[ঠিক আছে] "abc \ s Def" ghi -> ['abc \\ s Def', 'ghi']
[ঠিক আছে] "" পরীক্ষা -> ['', 'পরীক্ষা']
[ঠিক আছে] '' পরীক্ষা -> ['', 'পরীক্ষা']
[ঠিক আছে] abc'def -> ["abc'def"]
[ঠিক আছে] abc'def '-> ["abc'def'"]
[ঠিক আছে] abc'def 'ghi -> ["abc'def'", 'ghi']
[ঠিক আছে] আবদ'এফ'ঘি -> ["আবদ'দেফ'গি]]
[ঠিক আছে] abc "Def -> ['abc" Def']
[ঠিক আছে] abc "Def" -> ['abc "def"']
[ঠিক আছে] abc "Def" ghi -> ['abc "Def" ",' ghi ']
[ঠিক আছে] abc "Def" ghi -> ['abc "Def" ghi']
[ঠিক আছে] r'AA 'আর'। * _ Xyz $ '-> ["r'AA'", "আর '*
শ্লেক্স: পুনরাবৃত্তি প্রতি 0.281 মিমি
csv: 0.030ms per iteration
পুনরায়: 0.04ms প্রতি পুনরাবৃত্তি
সুতরাং পারফরম্যান্স তুলনায় অনেক ভাল shlex
, এবং নিয়মিত এক্সপ্রেশনকে পূর্ববর্তী করে আরও উন্নত করা যায়, এক্ষেত্রে এটি csv
পদ্ধতির চেয়ে বেশি কার্যকর হবে।