【问题标题】:python string manipulationpython字符串操作
【发布时间】:2011-05-01 06:11:28
【问题描述】:

我有一个带有嵌套括号的字符串ss = "AX(p>q)&E((-p)Ur)"

我想删除所有括号对之间的所有字符并存储在一个新字符串中,如下所示:new_string = AX&E

我试过这样做:

p = re.compile("\(.*?\)", re.DOTALL)
new_string = p.sub("", s)

它给出输出:AX&EUr)

有没有办法纠正这个问题,而不是迭代字符串中的每个元素?

【问题讨论】:

  • @ghostdog74 概率。因为 OP 在那里发布了一个非嵌套示例,并且只有通过他需要涵盖嵌套的答案才意识到。
  • 是的。对于那个很抱歉 :)。我尝试编辑以前的帖子,看到没有回复,我想我会发一个新帖子。

标签: python regex string


【解决方案1】:

另一个简单的选择是在每个阶段删除最里面的括号,直到没有更多的括号:

p = re.compile("\([^()]*\)")
count = 1
while count:
    s, count = p.subn("", s)

工作示例:http://ideone.com/WicDK

【讨论】:

  • 您不需要进行搜索,使用 re.subn() 会返回新字符串和所做的替换计数...重复直到计数为零。
  • @John - 谢谢!我能够写出类似ideone.com/0zEAO - count = 1; while count != 0: s, count = p.subn("", s) 的东西 - 这看起来够简单吗?我可以/应该将其缩短为单线吗?
  • @Kobi:只需使用while count: 而不是while count != 0:
  • @Kobi:可以通过将.subn 提升出循环来进一步缩短它。
  • @Kobi: 做xsubn = re.compile(yadda_yadda).subn 然后在循环中做s, count = xsubn('', s)
【解决方案2】:

你可以只使用不带正则表达式的字符串操作

>>> s = "AX(p>q)&E(qUr)"
>>> [ i.split("(")[0] for i in s.split(")") ]
['AX', '&E', '']

我留给你加入字符串。

【讨论】:

    【解决方案3】:
    >>> import re
    >>> s = "AX(p>q)&E(qUr)"
    >>> re.compile("""\([^\)]*\)""").sub('', s)
    'AX&E'
    

    【讨论】:

    • 行得通。但是你能解释一下 ezpression re.compile("""([^)]*)""").sub('', s)
    • 该正则表达式匹配左括号、任意数量的非括号字符,然后是右括号。
    • 是的。但这不适用于带有嵌套括号的字符串。像这样:AX(p>q)&E((-p)Ur)
    • 这不行,你只是改变了输入字符串。
    【解决方案4】:

    是的,应该是:

    >>> import re
    >>> s = "AX(p>q)&E(qUr)"
    >>> p = re.compile("\(.*?\)", re.DOTALL)
    >>> new_string = p.sub("", s)
    >>> new_string
    'AX&E'
    

    【讨论】:

      【解决方案5】:

      嵌套括号(或标签,...)是无法使用正则表达式以一般方式处理的东西。有关详细信息,请参阅http://www.amazon.de/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ref=sr_1_1?ie=UTF8&s=gateway&qid=1304230523&sr=8-1-spell。你需要一个真正的解析器。

      可以构造一个可以处理两级嵌套的正则表达式,但是它们已经很丑陋了,三级已经很长了。而且您不想考虑四个级别。 ;-)

      【讨论】:

      • 这对 Python 的正则表达式引擎来说是正确的;但是,.NET 或最近的 Perl/PHP 版本等其他实现确实支持递归正则表达式。
      • 您能否提供一些文档和/或代码示例的指针?对我来说会很有趣!
      • 试试这样的:\((?:[\w\s]++|(?R))*\) - regexr.com?2tln2。不过,如果您查找数据,我相信您可以找到数据。
      • 接下来,每个额外级别都特别丑陋的说法也不是很正确。使用递归模式作为基础,0 级(基础):\([\w\s]*+\)。 1 级:\((?:[\w\s]++|\([\w\s]*+\))*\),2 级:\((?:[\w\s]++|\((?:[\w\s]++|\([\w\s]*+\))*\))*\)。每个额外的级别都会稍微复杂一点(线性),您可以轻松地为任何给定的嵌套级别自动构建该字符串。 (你基本上是粘贴模式而不是(?R)
      【解决方案6】:

      可以使用PyParsing解析字符串:

      from pyparsing import nestedExpr
      import sys
      
      s = "AX(p>q)&E((-p)Ur)"
      expr = nestedExpr('(', ')')
      result = expr.parseString('(' + s + ')').asList()[0]
      s = ''.join(filter(lambda x: isinstance(x, str), result))
      print(s)
      

      大部分代码来自:How can a recursive regexp be implemented in python?

      【讨论】:

      • 最后两行来自不太了解 Python 但可以使用 Google 的人。我很确定print 是对的......
      • 替换最后两行的更简洁和干净的方法是:print ''.join(item for item in result if isinstance(item, str))
      • 亲爱的downvoter - 很可能这里的某个地方有错误 - 我这里没有 Python 也没有检查 整个 代码,只是 IDEONE 上的一部分,并且参考了其余的。我不介意 -2,但我希望得到更正!
      【解决方案7】:

      你可以使用re.subn():

      import re
      
      s = 'AX(p>q)&E((-p)Ur)'
      while True:
          s, n = re.subn(r'\([^)(]*\)', '', s)
          if n == 0:
              break
      print(s)
      

      输出

      AX&E
      

      【讨论】:

      • 我在 2.5 小时前对@Kobi 的答案之一的评论中已经提出了建议。
      • @John Machin:我知道。我在发布答案后看到了它。最初我在 4 年前遇到过该代码 velocityreviews.com/forums/…
      【解决方案8】:

      这就是你的做法:

      # strings
      # double and single quotes use in Python
      "hey there! welcome to CIP"   
      'hey there! welcome to CIP'  
      "you'll understand python"          
      'i said, "python is awesome!"'      
      'i can\'t live without python'      
      # use of 'r' before string
      print(r"\new code", "\n")    
      
      first = "code in"
      last = "python"
      first + last     #concatenation
      
      # slicing of strings
      
      user = "code in python!"
      
      print(user)
      print(user[5])   # print an element 
      print(user[-3])  # print an element from rear end
      print(user[2:6]) # slicing the string
      print(user[:6])  
      print(user[2:])
      print(len(user))   # length of the string
      print(user.upper()) # convert to uppercase
      print(user.lstrip())
      print(user.rstrip())
      print(max(user)) # max alphabet from user string
      print(min(user)) # min alphabet from user string
      print(user.join([1,2,3,4]))
      
      input()
      

      【讨论】:

      • 对代码的一些解释有帮助,否则会被标记为低质量
      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多