将字符串拆分为多个部分(使用正则表达式?)

时间:2018-12-12 21:43:58

标签: python string python-3.x parsing split

问题源自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']]

2 个答案:

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