如果我执行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"
答案 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'
根据您的评论,您的输入字符串中只有一个nox
或xno
。如果是,那么你可以试试这个,
>>> 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