【问题标题】:Splitting a string into parts (with regexps?)将字符串拆分为多个部分(使用正则表达式?)
【发布时间】:2019-05-14 01:52:36
【问题描述】:

来自https://stackoverflow.com/a/53750697/856090的问题的答案。

我们收到一个“输入”字符串。

输入字符串被+s(即\s+\+\s+ regexp)分割成几个“命令”。但是,在拆分引用 + (\+) 时应被忽略。

然后每个命令被空格字符分割成几个“参数”,但引用的 (\) 空格不计入分割,而是成为参数的一部分。

引用\(即\\)变为常规字符\,并且本身不参与引用。

我的解决方案是逐个字符地处理输入字符串,对\+ 和空白字符具有特殊行为。这很慢而且不优雅。我要求另一种解决方案(例如使用正则表达式)。

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

【问题讨论】:

  • 请举例说明输入和预期输出(你希望拆分后得到的)。
  • @hygull 示例添加
  • 如果没有人解决,我会尝试解决,实际上我现在在移动。明白了。谢谢。
  • 最后,我在 rextester 解决了您的移动问题。疯狂令人兴奋的问题。我现在正在写答案。谢谢。
  • 如果你得到[['a', '+', 'b'], ['c', 'd']] 代替[['a', '+', 'b'], ['c d']] 会怎样。实际上,在第一次拆分操作之后,两者都包含用于分隔的空格,或者我们需要为这种操作传递额外的参数。我也尝试过获得第二个结果,但我得到了第一个结果,但它失败了,所以我猜我们可能需要额外的参数。所以我想,如果你愿意或者我建议的 O/P 没问题,那么我会编辑或者我会尝试其他方法来解决。谢谢。

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


【解决方案1】:

我编写了自己的例程版本:

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

【讨论】:

    【解决方案2】:

    这是您问题的答案。

    这里的函数get_splitted_strings_for()取1个s类型的参数,将1一分为二,分割2次,最后将结果存入二维列表。

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

    【讨论】:

    • 错了!应该是[['a', '+', 'b'], ['c d']]
    • 好的,抱歉,让我来解决。谢谢。
    • 我尝试以多种方式获得第二个输出,但子字符串中有空格。所以我建议如果[['a', '+', 'b'], ['c', 'd']] 会帮助你,那么它会更好,否则它会在函数的参数列表中引入额外的参数,这再次需要你的更多输入。目前,我只为此更新了我的答案。谢谢。
    • 我不明白你:“帮助你会更好,否则它会引入额外的参数”。这是什么意思?
    • 我觉得不需要,我换个方式试试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2012-12-07
    • 2013-09-11
    • 2019-10-28
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多