re.search()TypeError:无法连接'str'和'NoneType'对象

时间:2015-06-27 10:22:28

标签: python regex

如果我执行re.search("(\d+)x",则下面的代码按预期工作。

但是,如果我添加替代搜索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

错误当然是因为我尝试将str "+""00"None连接起来。

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

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

示例str:

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

4 个答案:

答案 0 :(得分:5)

我会这样做:

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

答案 1 :(得分: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'

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

答案 2 :(得分:2)

如果您只传递第一个字符串,那么您的程序就可以正常工作了。但是当你传递第二个字符串时,第二个组匹配。 group(1)为None,而group(2)为2.

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

答案 3 :(得分: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