当前位置: 首页 > 面试题库 >

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

东方旺
2023-03-14
问题内容

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

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

因此从根本上讲,它是演员姓名的列表(可选地,后面是他们在括号中的角色)。角色本身可以包含逗号(演员的名字不能,我强烈希望如此)。

我的目标是将此字符串分成成对的列表- (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', '']

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

是否有任何更简单/更好的方法来执行此操作,而只需一个正则表达式或一段不错的代码?


问题答案:

一种方法是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)"

如果您需要处理嵌套,则最好的选择是将字符串分成括号,逗号和其他所有内容(本质上是对其进行标记化-
这部分仍可以使用正则表达式来完成),然后遍历这些标记重新组合字段,并保持跟踪嵌套级别(此嵌套级别是正则表达式无法自行执行的操作)。



 类似资料:
  • 我有一个字符串,我想用逗号爆炸,但前提是逗号没有嵌套在一些括号内。这是一个相当常见的用例,我一直在阅读这个论坛上的回复帖子,但没有真正找到我要找的东西。 所以,具体来说:重点是,我有一个字符串(=SQL SELECT…FROM语句),我想从列表中提取元素,用逗号分隔,用这个字符串编码(=要从中选择的列的名称)。但是,这些元素可以包含方括号,实际上是函数调用。例如,在SQL中,可以这样做 显然,我想

  • 问题内容: 我有一个像这样的字符串: 上面的字符串应分为: 问题答案: 我认为最简单的解决方案是处理输入字符串char-by-char: 例: 作为免费赠品,此解决方案还根据需要计算嵌套括号: 它还检查括号是否平衡(每个开放的括号都有相应的结束符)。

  • 问题内容: 我想在逗号(,)上的java中拆分字符串,但是只要逗号(,)位于某些括号之间,就不应拆分。 例如字符串: 应该产生: 当我使用时: 我最终将整个文本划分为(last,if),我可以看到split需要一个正则表达式,但是我似乎想不出如何使它完成工作。 问题答案: 您可以使用此模式-(不适用于嵌套括号) 演示版

  • 问题内容: 我有一个长度未知的字符串,看起来像这样 将这些字符串用逗号分隔的最佳方法是什么,以便每个单词都可以成为的元素? 例如 问题答案: 你可以这样做: 基本上,该方法将根据你正在传递的(在这种情况下)定界符来分割字符串,并将返回字符串数组。 但是,你似乎位于字符串列表而不是数组之后,因此必须使用该实用程序将数组转换为列表。就像供你参考一样,你也可以这样做: 但是通常最好是对接口进行编程,而不

  • 输入字符串用逗号分隔。但它可能包含双引号内的逗号,需要忽略。下面是示例字符串 下面是我用来拆分逗号的代码,但如果逗号是双引号中字符串的一部分,它就会失败。 所以任何解决这个问题的想法。

  • 问题内容: 我有一个模糊的字符串,像这样: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。) 上面的字符串应分为: 注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体