作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我得到了这样格式的字符串:
"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)']
上面的正则表达式匹配一个或多个:
这种方法的一个怪癖是相邻的分隔符被视为单个分隔符。也就是说,您不会看到空字符串。根据您的用例,这可能是错误或功能。
另请注意,正则表达式不适用于可能存在嵌套的情况。因此,例如,这会错误地拆分:
"Wilbur Smith (son of John (Johnny, son of James), aka Billy), Eddie Murphy (John)"
如果您需要处理嵌套,最好的办法是将字符串划分为括号、逗号和其他任何内容(本质上是对其进行标记——这部分仍然可以使用正则表达式完成),然后遍历这些标记重新组装字段,随时跟踪您的嵌套级别(这种跟踪嵌套级别是正则表达式自己无法做到的)。
关于python - 如何用括号外的逗号分割字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1648537/
我是一名优秀的程序员,十分优秀!