【问题标题】:Splitting String in List but keeping the delimiter在列表中拆分字符串但保留分隔符
【发布时间】:2020-03-31 11:49:51
【问题描述】:

我有一个字符串列表:

List = ['aaa', 'bbb ccc', 'ddd (eee)']

我想在“(”之前的空白处或在“(”处拆分具有括号的元素,以防前面没有空格。但在这种情况下,我想保留括号。到目前为止,我如果有空白,则提出以下代码:

for l in List:
   if re.search('\(', l) != None:
       a,b = re.split(' (?=\()', l)
       print('True')
       List_2.append(a)
       List_2.append(b)
   else:
       List_2.append(l)

print(List_2)

两个问题:首先,是否有更简洁的版本,可能使用列表理解。 其次,如何捕获没有空白'fff(ggg)'的案例。

最终列表应如下所示:

List_correct['aaa', 'bbb ccc', 'ddd', '(eee)', 'fff', '(ggg)']

【问题讨论】:

  • 顺便说一下,使用is not None而不是!= None
  • 为什么结果中的元素比源中的元素多? 'fff''(ggg)' 来自哪里?应该删除 () 的示例在哪里?
  • 为什么'bbb ccc' 在第二个问题中变成'bbb', 'ccc'
  • 你应该使用r'\('而不是'\('
  • [x for l in List for x in re.split(r'\s*(?=\()', l) if x],见ideone.com/WaNUoC

标签: python regex list


【解决方案1】:

代码:

List = ['aaa', 'bbb ccc', 'ddd (eee)', 'fff(ggg)']
result = [subitem for item in List for subitem in re.split(r"(?:\b|\s)(?=\()", item)]

输出:

>>>print(result)
['aaa', 'bbb ccc', 'ddd', '(eee)', 'fff', '(ggg)']

【讨论】:

  • 不错的答案!您可以将正则表达式改进为 \s|\b(?=\(),这需要 24 步,而您的正则表达式需要 62 步。 Demo
  • @ArvindKumarAvinash 感谢您的建议,我会改进答案。
  • 抱歉!您的正则表达式完全符合要求。我错过了bbb ccc 应该保持在一起的要求。此外,我的正则表达式 \s|\b(?=\() 将因括号内的空格而失败(但是,问题中没有提到这样的要求)。我可以想到一个替代正则表达式,\b(?=\()|\s(?![^(]) Regex Demo | Demo using Java;但您无需更改解决方案。
猜你喜欢
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多