【问题标题】:Return string within a string based on expression 'x={(.*)}'在基于表达式'x={(.*)}'的字符串中返回字符串
【发布时间】:2018-04-06 18:40:33
【问题描述】:

我有一个可以变化的字符串,但总是包含x={stuffNeeded}

例如:n=1,x={y,z,w},erore={3,4,5}x={y,z,w}erore={3,4,5},x={y,z,w}

我正忙着弄清楚如何获得y,z,w。我最接近找到答案的依据是 Yatharth 在另一篇帖子 Regular expression to return all characters between two special characters 上的回答。

到目前为止,我在搜索中遇到了几乎可行的东西。测试是在http://rubular.com/r/bgixv2J6yF 和 python 中完成的。

这是在 python 中使用的:

i='n=1,x={y,z,w},erore={3,4,5}'
j='n=1,x={y,z,w}'
print re.search('x={(.*)}',i).group(1)
print re.search('x={(.*)}',j).group(1)
print re.search('x={(.*)}.',i).group(1)
print re.search('x={(.*)}.',j).group(1)

四种不同打印的结果:

'y,z,w'
'y,z,w},erore={3,4,5'
AttributeError: 'NoneType' object has no attribute 'group'
'y,z,w'

对于所有情况,需要的结果是'y,z,w',然后如果真的找不到x={*},我会放置一个错误捕获。

提前谢谢你。

【问题讨论】:

  • x={yz,w} 是错字吗?
  • 赞成“一个时代的恶魔”这句话:D
  • @Ev.Kounis:这肯定是一个错字。谢谢

标签: python regex


【解决方案1】:

这个正则表达式做你想做的事:

regex = r'x={([^\}]*)}'

现场演示here

说明

  • {([^\}]*) :查找左括号,然后查找(并捕获)任意数量的非 } 字符。因此,您的第 1 组将包含 x 的捕获值。
  • }:查找右括号

【讨论】:

    【解决方案2】:

    主要问题是{(.*)} 匹配以{ 开头并以} 结尾的最长字符串,在某些情况下为y,z,w},erore={3,4,5

    您可以通过添加? 来使用非贪婪匹配。您不需要任何其他情况。

    import re
    
    i='n=1,x={y,z,w},erore={3,4,5}'
    j='n=1,x={y,z,w}'
    expr = 'x={(.*?)}'
    print (re.search(expr,i).group(1))
    print (re.search(expr,j).group(1))
    

    结果:

    y,z,w
    y,z,w
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      import re
      s = 'n=1,x={y,z,w},erore={3,4,5}'
      final_data = re.findall('=\{(.*?)\}', s)
      

      输出:

      ['y,z,w', '3,4,5']
      

      【讨论】:

        【解决方案4】:

        使用re.findall

        >>> import re
        >>> re.findall('x={[^\}]*}', s)
        

        #driver 值:

        IN : s = 'n=1,x={y,z,w},erore={3,4,5}'
        OUT : ['x={y,z,w}']
        
        IN : s = 'n=1,x={y,z,w}'
        OUT : ['x={y,z,w}']
        
        IN : s = 'x={y,z,w}'
        OUT : ['x={y,z,w}']
        

        现在要获取 x, y, z 的值,请使用 splitstrip

        >>> l = re.findall('x={[^\}]*}', s)
        
        #if `l` is not empty
        >>> out = l[0]
        => 'x={y,z,w}'
        
        >>> y, z, x = out.strip('x={}').split(',')
        >>> y, z, x
        => ('y', 'z', 'w')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-24
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          相关资源
          最近更新 更多