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

标签 python regex split

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

"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/

相关文章:

python - 电子邮件仅发送给第一个收件人 smtp 邮件 python

c# - 在 OpenFileDialog 中过滤文件的正则表达式

regex - XSLT - 通过分析文本节点添加新节点

vb.net - 在 VB.NET 中拆分字符串

java - 为什么在尝试使用 split ("."拆分字符串时打印出一个空数组)

python - 在 GTK 中,如何使窗口无法关闭?

python - 如何在谷歌colab中安装web3

python - 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

arrays - 打印正则表达式匹配 Perl

r - 如何优雅地将日期时间从十进制转换为 "%d.%m.%y %H:%M:%S"?