gpt4 book ai didi

python - 如何用括号外的逗号分割字符串?

转载 作者:IT老高 更新时间:2023-10-28 20:33:21 28 4
gpt4 key购买 nike

我得到了这样格式的字符串:

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

所以基本上它是 Actor 姓名的列表(可选地在括号中加上他们的角色)。角色本身可以包含逗号( Actor 的名字不能,我强烈希望如此)。

我的目标是将这个字符串拆分成一对列表 - (actor name, actor role)

一个明显的解决方案是遍历每个字符,检查 '(', ')'',' 的出现并在出现逗号外部时将其拆分。不过这个好像有点重……

我正在考虑使用正则表达式拆分它:首先用括号拆分字符串:

import re
x = "Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
s = re.split(r'[()]', x)
# ['Wilbur Smith ', 'Billy, son of John', ', Eddie Murphy ', 'John', ', Elvis Presley, Jane Doe ', 'Jane Doe', '']

这里奇怪的元素是 Actor 的名字,甚至是角色。然后我可以用逗号分隔名称并以某种方式提取名称-角色对。但这似乎比我的第一种方法更糟糕。

有没有更简单/更好的方法来做到这一点,无论是使用单个正则表达式还是一段漂亮的代码?

最佳答案

一种方法是使用 findall 和正则表达式,贪婪地匹配分隔符之间的内容。例如:

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

上面的正则表达式匹配一个或多个:

  • 非逗号、非开括号字符
  • 以左括号开头的字符串,包含 0 个或多个非闭括号,然后是闭括号

这种方法的一个怪癖是相邻的分隔符被视为单个分隔符。也就是说,您不会看到空字符串。根据您的用例,这可能是错误或功能。

另请注意,正则表达式适用于可能存在嵌套的情况。因此,例如,这会错误地拆分:

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

如果您需要处理嵌套,最好的办法是将字符串划分为括号、逗号和其他任何内容(本质上是对其进行标记——这部分仍然可以使用正则表达式完成),然后遍历这些标记重新组装字段,随时跟踪您的嵌套级别(这种跟踪嵌套级别是正则表达式自己无法做到的)。

关于python - 如何用括号外的逗号分割字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1648537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com