在每个字母后插入逗号,但跳过引号

时间:2019-03-05 03:57:38

标签: python string

我想用逗号分割字符串,但将分组保留在引号中(单引号或双引号)。

示例(输入->所需输出):

"ABC" -> "A,B,C"
"AB'CD'E" -> "A,B,'CD',E"
'AB"CDG"EF' -> 'A,B,"CDG",E,F'

我当时想遍历字符串并在遇到引号时跳过,但是不确定如何处理结束引号的索引。

def convert(str):
    new_str = ''
    for c in str:
        if c not in ["'", '"']:
            new_str = new_str + c + ','
        else:
            ??

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

我会尝试使用正则表达式;如果您不需要,请不要自己编写解析器。

我假设您的字符串仅包含字母字符,所有带引号的组都是非空的(即引号之间始终有一些字符),并且您没有任何未封闭的引号。

这似乎可行:

import re

s = "AB'CD'E"
splits = re.findall("\"[A-z]+\"|'[A-z]+'|[A-z]", s)
# ['A', 'B', "'CD'", 'E']
",".join(splits)
# "A,B,'CD',E"

给定的正则表达式查找由双引号或单引号引起来的字母字符组,或者仅针对单个字符。

答案 1 :(得分:0)

假设字符串格式正确且引号平衡,则可以用re.sub替换带引号的子字符串和不带引号的字符:

re.sub("('[^']*'|.)(?!$)", r'\1,',  "AB'CD'E")
# A,B,'CD',E

如果您需要更复杂的内容,则可以按照建议尝试逐个字符地进行解析。使用变量跟踪当前状态-当前字符是否以引号引起来。

答案 2 :(得分:0)

在两行代码中有更简单的方法,但是我想完善您函数中的逻辑。您需要测试引号的开始位置和结束位置,因为在该时间间隔内无需执行任何操作

Scanner Scan = new Scanner(System.in).useLocale(Locale.US);