【问题标题】:How to split duplicated separator in Python如何在 Python 中拆分重复的分隔符
【发布时间】:2021-01-23 12:06:28
【问题描述】:

我有一个格式为的字符串 exp = '(( 200 + (4 * 3.14)) / ( 2 ** 3 ))'

我想使用re.split() 将字符串分隔为标记,并包含分隔符。但是,我无法将** 拆分在一起,最终被* 拆分。

这是我的代码:tokens = re.split(r'([+|-|**?|/|(|)])',exp)

我的输出(错误):

['(', '(', '200', '+', '(', '4', '*', '3.14', ')', ')', '/', '(', '2', '*', '*', '3', ')', ')']

我想问有没有办法在*** 之间拆分分隔符?非常感谢!

期望的输出:

['(', '(', '200', '+', '(', '4', '*', '3.14', ')', ')', '/', '(', '2', '**', '3', ')', ')']

【问题讨论】:

  • 丑陋但简单:首先将“**”替换为任何不能像下划线一样出现的单个字符。然后拆分,稍后将其替换回来
  • @PabloHenkowski 哦,是的,我从没想过!非常感谢!
  • 试试这个正则表达式:r'(\*\*|\*|\+|-|/|\(|\))'(请参阅ast 模块以获得更好的选择)stackoverflow.com/questions/5049489/…
  • @VPfB 是的,这行得通!非常感谢!

标签: python split strsplit


【解决方案1】:

使用 [...] 表示法仅允许您指定单个字符。要获得可变大小的替代模式,您需要使用 |这些括号之外的运算符。这也意味着您需要转义正则表达式运算符,并且需要将较长的模式放在较短的模式之前(即 ** 在 * 之前)

tokens  = re.split(r'(\*\*|\*|\+|\-|/|\(|\))',exp)

甚至更短:

tokens = re.split(r'(\*\*|[*+-/()])',exp)

【讨论】:

  • 好的!这种模式真的优先 ** 在 * 之前!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 2014-02-08
  • 2011-06-27
  • 2014-12-18
  • 2019-03-04
  • 2017-10-30
  • 2020-10-03
相关资源
最近更新 更多