Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将空格替换为逗号忽略引号中的空格_Python_Algorithm - Fatal编程技术网

Python 将空格替换为逗号忽略引号中的空格

Python 将空格替换为逗号忽略引号中的空格,python,algorithm,Python,Algorithm,给定一个由空格分隔的字符串。需要用逗号替换空白,忽略引号中的空白 >>> some_string = 'one two "three four" five "six seven"' >>> replace_func(some_string) 'one,two,"three four",five,"six seven"' 以下是一个简单的决定: def replace_func(some_str): lines = [] i = 1 f

给定一个由空格分隔的字符串。需要用逗号替换空白,忽略引号中的空白

>>> some_string = 'one two "three four" five "six seven"'
>>> replace_func(some_string)
'one,two,"three four",five,"six seven"'
以下是一个简单的决定:

def replace_func(some_str):
    lines = []
    i = 1
    for l in struct.split('"'):
        if i % 2:
            lines.append(l.replace(' ', ',')
        else:
            lines.append(l)
        i += 1

    parsed_struct = '"'.join(lines)

有什么建议吗?

这可以通过以下帮助轻松完成:

我需要保留引号,您可以这样做:

>>> ','.join(['"{0}"'.format(fragment) if ' ' in fragment else fragment
...           for fragment in shlex.split(some_string)])
'one,two,"three four",five,"six seven"'

或者,您可以尝试使用正则表达式实现更简单的解决方案:

>>> import re
>>> ','.join(re.findall('\"[^\"]*\"|\S+', some_string))
'one,two,"three four",five,"six seven"'
result = re.sub(' (?=(?:[^"]*"[^"]*")*[^"]*$)', ",", subject)

使用正则表达式的替代方法:

>>> import re
>>> ','.join(re.findall('\"[^\"]*\"|\S+', some_string))
'one,two,"three four",five,"six seven"'
result = re.sub(' (?=(?:[^"]*"[^"]*")*[^"]*$)', ",", subject)

它匹配一个空格,并且仅当其后有偶数个引号时才用逗号替换它。因此,它将只在字符串之外匹配。

Pyparsing通常比正则表达式更容易阅读和理解:

>>> some_string = 'one two "three four" five "six seven"'
>>> from pyparsing import OneOrMore, quotedString, Word, printables
>>> ','.join(OneOrMore(quotedString | Word(printables)).parseString(some_string))
'one,two,"three four",five,"six seven"'

这也将删除双引号,这不是所谓的wants@MohamedKhamis谢谢你的评论。我更新了我的答案以考虑到这一点。太好了!幸好我在发布自己的乱七八糟之前看到了这一点!非常感谢thanx,我需要深入研究标准python库,就像正则表达式一样,thanx是您的解决方案