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

4

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

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

输入字符串通过\s+\+\s+正则表达式中的+分成多个“命令”。但是在拆分时,应忽略引用的+\+)。

然后,每个命令通过空格字符分成多个“参数”,但是引用的(\)空格不计入拆分,并且成为参数的一部分。

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

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

我用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
如果没有人解决,我会尝试解决,实际上我现在正在使用手机。好的,谢谢。 - hygull
1
最终,我在rextester上解决了你的移动问题。这是一个非常激动人心的问题。我正在写答案。谢谢。 - hygull
如果你得到的是[['a', '+', 'b'], ['c d']]而不是[['a', '+', 'b'], ['c', 'd']],那该怎么办呢?实际上,在第一次分割操作后,两者都包含空格分隔符,或者我们需要传递额外的参数来进行这种操作。我也尝试过获得第二个结果,我成功了,但对于第一个结果失败了,所以我猜想我们可能需要额外的参数来解决这个问题。因此,如果你愿意或者我的建议输出可以的话,我会进行编辑或者尝试其他方法来解决。谢谢。 - hygull
@parton,我已根据您提供的输入集更新了我的代码,请检查。谢谢。 - hygull
显示剩余3条评论
2个回答

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

0

这是您问题的答案。

这里的函数 get_splitted_strings_for() 接受一个类型为字符串的参数 s,按顺序分割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
错误!应该是[['a', '+', 'b'],['c d']] - porton
好的,对不起,让我来修复一下。谢谢。 - hygull
我尝试了几种方法来获取第二个输出,但是在子字符串中得到了空格。因此,我建议如果[['a', '+', 'b'], ['c', 'd']]对您有帮助,那么这将更好,否则它会在函数的参数列表中引入额外的参数,这又需要您提供更多的输入。目前,我只为此更新了我的答案。谢谢。 - hygull
我认为这不是必需的,让我用其他的方式试试。谢谢。 - hygull
根据您提供的输入集,我重新尝试查看并更新了我的代码。现在它可以适用于您提供的两个输入集。请检查一下。谢谢。 - hygull
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接