2015-06-27 50 views
0

下面的代码按照预期工作,如果我做re.search("(\d+)x"re.search()TypeError:不能连接'str'和'NoneType'对象

但是如果我添加其他搜索re.search("(\d+)x|x(\d+)"我得到:

TypeError: cannot concatenate 'str' and 'NoneType' objects 

代码:

fundleverage = None 
regex_fundleverage = None 
regex_fundleverage = re.search(r"(\d+)x|x(\d+)", instrument_name, flags=re.IGNORECASE) 
if funddirection == "Long" and not regex_fundleverage == None: 
    fundleverage = "+" + regex_fundleverage.group(1) + "00" 
if funddirection == "Short" and not regex_fundleverage == None: 
    fundleverage = "-" + regex_fundleverage.group(1) + "00" 
print "Fundleverage: %s" % fundleverage 

错误当然是因为我会再做连接海峡"+""00"None

我的问题是为什么选择group(1)只有在re.search()中只有一个查找时才起作用,但如果有两个备用查找则不起作用。

它正在搜索的字符串不包含替代方案"(\d+)x""x(\d+)",只有一个可能。

例STR:

"Boost LevDAX 3x Daily ETP" 
"ComStage LevDAX x2 UCITS ETF" 
+0

如果您需要两个输出,那么不要在're.search'中使用上述正则表达式,因为一旦找到第一个匹配项,搜索就会停止。 –

+0

@AvinashRaj字符串中只有一个选项存在。我的理解是正确的,它只会“看”第一种选择,而不是第二种选择,因此如果不存在,就使它成为“无”? – Winterflags

+0

永不比较无 – TheGeorgeous

回答

6

我会做这种方式:

regex_fundleverage = re.findall('(?<=x)\d+|\d+(?=x)',instrument_name, flags=re.IGNORECASE) 

if funddirection == "Long" and regex_fundleverage: 
    fundleverage = "+" + regex_fundleverage[0] + "00" 

if funddirection == "Short" and regex_fundleverage: 
    fundleverage = "-" + regex_fundleverage[0] + "00" 

print "Fundleverage: %s" % fundleverage 
+0

返回'无',我不知道如果正则表达式找到任何东西。将尝试找到错误。 – Winterflags

+0

它缺少'而不是regex_fundleverage = None:',你能否更新你的答案?它现在的作品:) – Winterflags

+1

@Winterflags ...感谢你指出,实际上,你可以做'和regex_fundleverage:'(不需要'而不是regex_fundleverage == None:')..它的意思是:'和if有什么在regex_fundleverage',如果'regex_fundleverage'是空的,它将会是'False' .. :) –

2

我没有使用re.findall

x = re.findall(r'(?<=x)\d+|\d+(?=x)', s) 

然后通过指定像x[0]第一索引获得的第一个元素。你不会得到None的价值。

您也可以使用re.search功能,无需捕获组。

re.search(r'(?<=x)\d+|\d+(?=x)', s).group() 

我想你想tjis,

>>> import re 
>>> s = "Boost LevDAX 3x Daily ETP" 
>>> re.sub(r'\d+(?=x)|(?<=x)\d+', r'+\g<0>00', s) 
'Boost LevDAX +300x Daily ETP' 

OR

>>> s = "Boost LevDAX 3x Daily ETP" 
>>> re.sub(r'(\d+)x|x(\d+)', lambda m: '+'+m.group(1)+'00' if m.group(1) else '+' + m.group(2) + '00', s) 
'Boost LevDAX +300 Daily ETP' 
>>> s = "ComStage LevDAX x2 UCITS ETF" 
>>> re.sub(r'(\d+)x|x(\d+)', lambda m: '+'+m.group(1)+'00' if m.group(1) else '+' + m.group(2) + '00', s) 
'ComStage LevDAX +200 UCITS ETF' 

根据您的意见,只有一个noxxno出现在你输入的字符串。如果是的话,那么你可能会试试这个,

>>> s = "ComStage LevDAX x2 UCITS ETF" 
>>> fundleverage = re.sub(r'.*(?:(\d+)x|x(\d+)).*', lambda m: '+'+m.group(1)+'00' if m.group(1) else '+' + m.group(2) + '00', s) 
>>> print fundleverage 
+0

嗯。 're.sub'解决方案正确替换为'+ 300',但保留整个字符串'“Boost LevDAX +300 Daily ETP”'。它应该只传递“+300”到变量'fundleverage'。除此之外,这看起来不错。 – Winterflags

+1

@Winterflags检查我的更新。 –

2

如果你通过只是第一个字符串你的程序将工作正常。但是当你传递第二个字符串时,第二个组匹配。组(1)是无,而组(2)是2.

我会重写您的代码来分隔两个子表达式并使用if语句来决定哪一个匹配。

2

使用正则表达式来检查,如果字符串是你想要的形状,而且如果它不那么就提取您想要通过使用\d+数量,因为你的字符串只能包含一个数字如下:

注意,优势这样做的这是,如果leverage是不是抛出一个错误所需的格式一样x3x在你的字符串

import re 
fundleverage = None 
regex_fundleverage = None 
funddirection = "Long" 
instrument_name = "ComStage LevDAX 3x UCITS ETF" 
regex_fundleverage = re.search(r"(\b\d+x|x\d+\b)", instrument_name, flags=re.IGNORECASE) 
if regex_fundleverage: 
    regex_fundleverage = re.search(r"(\d+)", regex_fundleverage.group(0), flags=re.IGNORECASE) 
print(regex_fundleverage.group(0)) 
if funddirection == "Long" and not regex_fundleverage == None: 
    fundleverage = "+" + regex_fundleverage.group(1) + "00" 
if funddirection == "Short" and not regex_fundleverage == None: 
    fundleverage = "-" + regex_fundleverage.group(1) + "00" 
print "Fundleverage: %s" % fundleverage 
+0

此解决方案有效。 – Winterflags

+1

@Winterflags,Nice :) –

+0

@Winterflags也考虑接受答案,如果你满意:) –

相关问题