问题源自https://stackoverflow.com/a/53750697/856090答案。
我们收到一个“输入”字符串。
通过+
正则表达式,\s+\+\s+
将输入字符串分成多个“命令”。但是,在拆分引用时+
(\+
)将被忽略。
然后,每个命令都由空格字符分割成几个“参数”,但在分割时不将带引号(\
)空格视为计数,而是成为参数的一部分。
被引用的\
(即\\
)成为常规字符\
,并且本身不参与报价。
我的解决方案是使用特殊行为处理\
,+
和空格字符的输入字符串char-by-char。这很慢而且不优雅。我要求其他解决方案(例如使用正则表达式)。
我用Python 3编写。
例如,
filter1 + \
chain -t http://www.w3.org/1999/xhtml -n error + \
transformation filter2 --arg x=y
转化过滤器3
成为
[['filter1'],
['chain', '-t', 'http://www.w3.org/1999/xhtml', '-n', 'error'],
['transformation', 'filter2', '--arg', 'x=y']]
和
a \+ b + c\ d
成为
[['a', '+', 'b'], ['c d']]
答案 0 :(得分:0)
这是您问题的答案。
此处函数 get_splitted_strings_for()接受1个类型为字符串 s 的参数,并将1除以1,进行2次分割,最后将结果存储在2d列表中。
import re
def get_splitted_strings_for(s):
splits = []
splits1 = re.split(r"\s*\+\s+\\\s*|\s+\+\s+", s)
for split in splits1:
if "\+" in split:
split = split.replace("\\", "")
splits.append(split.split())
elif "\\" in split:
splits.append([split.replace("\\", "")])
else:
arr = re.split(r"\s+", split.replace("\\", ''))
splits.append(arr)
return splits
s = "filter1 + \ chain -t http://www.w3.org/1999/xhtml -n error + \ transformation filter2 --arg x=y"
print(get_splitted_strings_for(s))
# [['filter1'], ['chain', '-t', 'http://www.w3.org/1999/xhtml', '-n', 'error'], ['transformation', 'filter2', '--arg', 'x=y']]
print() # New line
s2 = "a \+ b + c\ d"
print(get_splitted_strings_for(s2))
# [['a', '+', 'b'], ['c d']]
答案 1 :(得分:0)
我编写了自己的例程版本:
import re
def split_pipeline(s):
res = [['']]
r = r'\\\\|\\\+|\\\s|\s+\+\s+|\s+|[^\s\\]+'
for m in re.finditer(r, s, re.M|re.S):
if m[0][0] == '\\':
res[-1][-1] += m[0][1:]
elif re.match(r'^\s+\+\s+$', m[0], re.M|re.S):
res.append([''])
elif re.match(r'^\s+$', m[0], re.M | re.S):
res[-1].append('')
else:
res[-1][-1] += m[0]
return res
print(split_pipeline(r'a\\ \+ b + c\ d'))
# [['a\\', '+', 'b'], ['c d']]