Python:错误重新编译()双位数函数

2024-09-28 01:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这个正则表达式需要找到"1x""x1",但它还必须能够找到两位数,例如"10x""x11"。你知道吗

leverage_match = re.compile(r"\d+X|X\d+", flags=re.IGNORECASE)

根据regex101.com,上述正则表达式应足以捕获以下对象的整数:

import pandas as pd
import re

df = pd.DataFrame(["BULL ESTOX 11X S", "BULL ESTOX X12 S"], columns=["name"])

name
"BULL ESTOX 11X S"
"BULL ESTOX X12 S"

但是,对于下面的代码,它只返回一个数字,例如,对于"11X",它变为"1X"。你知道吗

leverage_match = re.compile(r"\d+X|X\d+", flags=re.IGNORECASE) #<- Same as seen above

def f(value):

    f2 = lambda x: leverage_match.findall(x)[0] if len(leverage_match.findall(x)) > 0 else ""

    leverage = f2(value)

    if leverage != "":
        return "{}".format(leverage)

    if leverage[0].replace("X","x") == "x":
        leverage = leverage[1]+leverage[0].replace('X','x')

df["description"] = df["name"].map(lambda x:f(x))

----------你知道吗

更新:这是完整的代码,以确保我没有遗漏任何重要内容:

import pandas as pd
import re

df = pd.DataFrame(["BULL ESTOX 11X S", "BULL ESTOX X12 S"], columns=["name"])

description_map = {"ESTOX":"Euro STOXX 50"}
underlying_match = re.compile(r"\s(\S+)\s")
leverage_match = re.compile(r"\d+X|X\d+", flags=re.IGNORECASE)

def f(value):

    f1 = lambda x: description_map[underlying_match.findall(x)[0]] if underlying_match.findall(x)[0] in description_map else ""
    f2 = lambda x: leverage_match.findall(x)[0] if len(leverage_match.findall(x)) > 0 else ""
    f3 = lambda x: "-" if "BEAR" in x else "-" if "SHORT" in x else ""

    underlying = f1(value)
    leverage = f2(value)
    sign = f3(value)

    statement = "Tracks " + underlying

    if underlying == "":
        if sign == "-" and leverage == "":
            return statement + "{}".format("inversely.")
        if sign == "-" and leverage != "":
            return statement + "{} with {}{} leverage.".format("inversely", sign, leverage)
        if sign == "" and leverage != "":
            return statement + "with {}{} leverage.".format(sign, leverage)
        else:
            return "Tracks"

    if leverage[0].replace("X","x") == "x":
        leverage = leverage[1]+leverage[0].replace('X','x')

    if leverage != "" and sign == "-":
        statement += " {} with {}{} leverage.".format("inversely", sign, leverage)
    elif leverage != "" and sign == "":
        statement += " with {} leverage.".format(leverage)
    else:
        if sign == "-":
            statement += " {} ".format("inversely")

    return statement

df["description"] = df["name"].map(lambda x:f(x))

print df

Tags: lambdareformatdfreturnifvaluematch
1条回答
网友
1楼 · 发布于 2024-09-28 01:23:55

我认为你举了一个错误的例子,比如下面的df

df = pd.DataFrame(["BULL AXP 11X S", "BULL AXP X11 S"], columns=["name"])

输出如下

             name                                 description
0  BULL AXP 11X S  Tracks American Express with 11X leverage.
1  BULL AXP X11 S   Tracks American Express with 1x leverage.

x11变为1x,因为您的代码的逻辑在以下部分中有错误:

if leverage[0].replace("X","x") == "x":
        leverage = leverage[1]+leverage[0].replace('X','x')

它应该如下所示:(更新

if leverage[0].replace("X","x") == "x":
        leverage = ''.join(leverage[1:])+leverage[0].replace('X','x')

如果您解决了这个问题,输出将如您所期望的那样,如下所示:

             name                                 description
0  BULL AXP 11X S  Tracks American Express with 11X leverage.
1  BULL AXP X11 S  Tracks American Express with 11x leverage.

完整代码

import pandas as pd
import re

df = pd.DataFrame(["BULL ESTOX 11X S", "BULL ESTOX X12 S"], columns=["name"])

description_map = {"ESTOX":"Euro STOXX 50"}
underlying_match = re.compile(r"\s(\S+)\s")
leverage_match = re.compile(r"\d+X|X\d+", flags=re.IGNORECASE)

def f(value):

    f1 = lambda x: description_map[underlying_match.findall(x)[0]] if underlying_match.findall(x)[0] in description_map else ""
    f2 = lambda x: leverage_match.findall(x)[0] if len(leverage_match.findall(x)) > 0 else ""
    f3 = lambda x: "-" if "BEAR" in x else "-" if "SHORT" in x else ""

    underlying = f1(value)
    leverage = f2(value)
    sign = f3(value)

    statement = "Tracks " + underlying

    if underlying == "":
        if sign == "-" and leverage == "":
            return statement + "{}".format("inversely.")
        if sign == "-" and leverage != "":
            return statement + "{} with {}{} leverage.".format("inversely", sign, leverage)
        if sign == "" and leverage != "":
            return statement + "with {}{} leverage.".format(sign, leverage)
        else:
            return "Tracks"

    if leverage[0].replace("X","x") == "x":
        leverage = ''.join(leverage[1:])+leverage[0].replace('X','x')

    if leverage != "" and sign == "-":
        statement += " {} with {}{} leverage.".format("inversely", sign, leverage)
    elif leverage != "" and sign == "":
        statement += " with {} leverage.".format(leverage)
    else:
        if sign == "-":
            statement += " {} ".format("inversely")

    return statement

df["description"] = df["name"].map(lambda x:f(x))

print df

相关问题 更多 >

    热门问题