基于表达式'x = {(。*)}'返回字符串中的字符串

时间:2017-10-25 15:27:50

标签: python regex

我有一个字符串可以变化但总是包含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={*},我会收到错误捕获。

提前谢谢。

4 个答案:

答案 0 :(得分:6)

这个正则表达式完成了你正在尝试做的事情:

active

现场演示here

<强>解释

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

答案 1 :(得分:3)

主要问题是,{(.*)}匹配以{开头并以}结尾的最长字符串,在某些情况下为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

答案 2 :(得分:1)

使用re.findall

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

#driver values:

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')

答案 3 :(得分:1)

你可以试试这个:

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

输出:

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