【问题标题】:Regular expression to return text between parenthesis正则表达式返回括号之间的文本
【发布时间】:2011-06-21 02:42:40
【问题描述】:
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

我只需要括号内的内容。

【问题讨论】:

  • 括号?我没有看到任何括号。你是说括号吗?
  • 为什么不用双引号?这将使字符串更易于阅读,即u"abcde(date='2/xc2/xb2',time='/case/test.png')"
  • 这个问题看着就紧张。我偷偷怀疑 OP 真的 想要 ast 中的功能,只是不知道它存在。

标签: python regex python-3.x


【解决方案1】:

使用re.search(r'\((.*?)\)',s).group(1):

>>> import re
>>> s = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
>>> re.search(r'\((.*?)\)',s).group(1)
u"date='2/xc2/xb2',time='/case/test.png'"

【讨论】:

    【解决方案2】:

    如果你的问题真的这么简单,你不需要正则表达式:

    s[s.find("(")+1:s.find(")")]
    

    【讨论】:

    • 如果没有'('和')'怎么办?你会得到 s[0:-1]。这意味着您将在 's' :\.如果你先检查字符串是否有括号会很好。
    • 如果您有“(一些文本(内括号中的一些文本)一些更多文本)”怎么办?
    • 那么问题就不像原来的问题那么简单了,需要换个方案。
    • 对于 Igor 的问题:如果您有这样的嵌套括号,则在操作的第二部分使用 rfind。有关详细信息,请参阅下面的我的帖子。
    【解决方案3】:
    import re
    
    fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
    
    print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
    

    【讨论】:

      【解决方案4】:

      如果你想找到所有的出现:

      >>> re.findall('\(.*?\)',s)
      [u"(date='2/xc2/xb2',time='/case/test.png')", u'(eee)']
      
      >>> re.findall('\((.*?)\)',s)
      [u"date='2/xc2/xb2',time='/case/test.png'", u'eee']
      

      【讨论】:

      • 可能是一个愚蠢的问题,但为什么是“?”需要吗?为什么“(。*)”不起作用?
      • @CutePoison 因为.* 是贪婪的(将采用最长的匹配)而.*? 不是贪婪的(将采用最短的匹配)
      • 谢谢!可能是整个晚上的最佳答案!
      • 这不起作用....你必须在 r".*((.*?)).*" 之前和之后添加 .*
      【解决方案5】:

      基于 tkerwin 的回答,如果您碰巧有 嵌套括号,如

      st = "sum((a+b)/(c+d))"
      

      如果您需要在第一个左括号最后右括号 得到(a+b)/(c+d),因为 find 从字符串的左侧开始搜索,并且会在第一个右括号处停止。

      要解决这个问题,你需要在操作的第二部分使用rfind,所以它会变成

      st[st.find("(")+1:st.rfind(")")]
      

      【讨论】:

      • @ALH 那个表达式没有 nested 括号,这是我的回答的好处。
      【解决方案6】:
      contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
      if contents_re:
          print(contents_re.groupdict()['contents'])
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值
      【解决方案7】:

      无需使用正则表达式 .... 只需使用列表切片...

      string="(tidtkdgkxkxlgxlhxl) ¥£%#_¥#_¥#_¥#"
      print(string[string.find("(")+1:string.find(")")])
      

      【讨论】:

      • 这已经在 9 年前发布了。
      【解决方案8】:

      这里有几种方法可以使用匹配的\(([^()]+)\) 正则表达式(参见its online demo)在 Pandas 中提取括号之间的字符串

      • \( - 一个 ( 字符
      • ([^()]+) - 然后将除 () 之外的任何一个或多个字符捕获到第 1 组
      • \) - ) 字符。

      提取第一个匹配项使用Series.str.extract

      import pandas as pd
      df = pd.DataFrame({'Description':['some text (value 1) and (value 2)']})
      df['Values'] = df['Description'].str.extract(r'\(([^()]+)\)')
      # => df['Values']
      #    0    value 1
      #    Name: Values, dtype: object
      

      提取(查找)所有匹配项使用Series.str.findall

      import pandas as pd
      df = pd.DataFrame({'Description':['some text (value 1) and (value 2)']})
      df['Values'] = df['Description'].str.findall(r'\(([^()]+)\)')
      # => df['Values']
      #    0    [value 1, value 2]
      #    Name: Values, dtype: object
      
      df['Values'] = df['Description'].str.findall(r'\(([^()]+)\)').str.join(', ')
      # => df['Values']
      #    0    value 1, value 2
      #    Name: Values, dtype: object
      

      请注意,.str.join(', ') 用于从结果字符串列表中创建一个逗号分隔的字符串。您可以根据自己的情况调整此分隔符。

      【讨论】:

        【解决方案9】:

        TheSoulkiller 的回答很棒。就我而言,我需要处理额外的括号,并且只提取括号内的单词。一个很小的改变就可以解决问题

        >>> s=u'abcde((((a+b))))-((a*b))'
        >>> re.findall('\((.*?)\)',s)
        ['(((a+b', '(a*b']
        >>> re.findall('\(+(.*?)\)',s)
        ['a+b', 'a*b']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-17
          • 2016-07-21
          • 2012-09-14
          • 2020-03-14
          相关资源
          最近更新 更多