我有一个字符串可以变化但总是包含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={*}
,我会收到错误捕获。
提前谢谢。
答案 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
的值,请使用split
和strip
:
>>> 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']