How to split a string by commas positioned outside of parenthesis?

前端 未结 10 2080
南方客
南方客 2020-11-27 19:36

I got a string of such format:

\"Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)\"

so basicly i

10条回答
  •  一整个雨季
    2020-11-27 19:59

    One way to do it is to use findall with a regex that greedily matches things that can go between separators. eg:

    >>> s = "Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
    >>> r = re.compile(r'(?:[^,(]|\([^)]*\))+')
    >>> r.findall(s)
    ['Wilbur Smith (Billy, son of John)', ' Eddie Murphy (John)', ' Elvis Presley', ' Jane Doe (Jane Doe)']
    

    The regex above matches one or more:

    • non-comma, non-open-paren characters
    • strings that start with an open paren, contain 0 or more non-close-parens, and then a close paren

    One quirk about this approach is that adjacent separators are treated as a single separator. That is, you won't see an empty string. That may be a bug or a feature depending on your use-case.

    Also note that regexes are not suitable for cases where nesting is a possibility. So for example, this would split incorrectly:

    "Wilbur Smith (son of John (Johnny, son of James), aka Billy), Eddie Murphy (John)"
    

    If you need to deal with nesting your best bet would be to partition the string into parens, commas, and everthing else (essentially tokenizing it -- this part could still be done with regexes) and then walk through those tokens reassembling the fields, keeping track of your nesting level as you go (this keeping track of the nesting level is what regexes are incapable of doing on their own).

提交回复
热议问题