Python 如果结果为“无”,则重新搜索()

Python 如果结果为“无”,则重新搜索(),python,Python,如何制作这个蟒蛇 def money_from_string(s): gold = re.search("([0-9]+)g", s) silver = re.search("([0-9]+)s", s) copper = re.search("([0-9]+)c", s) s = re.sub("[0-9]+g", "", s) s = re.sub("[0-9]+s", "", s) s = re.sub("[0-9]+c", "", s)

如何制作这个蟒蛇

def money_from_string(s):
    gold = re.search("([0-9]+)g", s)
    silver = re.search("([0-9]+)s", s)
    copper = re.search("([0-9]+)c", s)
    s = re.sub("[0-9]+g", "", s)
    s = re.sub("[0-9]+s", "", s)
    s = re.sub("[0-9]+c", "", s)
    assert (len(s.strip()) == 0) # should be 0

    return (gold.group() or 0) * 10000 + (silver.group() or 0) * 100 + (copper.group() or 0)
这不起作用,因为如果
gold
None
gold.group()
将抛出错误

输入示例和预期输出:

s = "15g17s5c" -> 150000 + 1700 + 5 -> 151705
s = "15g5s"    -> 150000 + 500      -> 150500
s = "15g"      -> 150000            -> 150000
s = "17s5c"    -> 1700 + 5          -> 1705
s = "5c"       -> 5                 -> 5
请注意,我对输入进行了适当的检查,以确保其格式正确。也就是说,它具有匹配性:

MONEY_PATTERNS = [
    "([0-9]+g[ ]*[0-9]+s[ ]*[0-9]+c)", # g / s / c
    "([0-9]+g[ ]*[0-9]+s)", # g / s
    "([0-9]+g[ ]*[0-9]+c)", # g / c
    "([0-9]+s[ ]*[0-9]+c)", # s / c
    "([0-9]+g)", # g
    "([0-9]+s)", # s
    "([0-9]+c)", # c
]

如果返回的值是
None
,则只需检查None并将其替换为
0
。这似乎很适合你想做的事情

def money_from_string(s):
    gold = re.search("([0-9]+)g", s)
    silver = re.search("([0-9]+)s", s)
    copper = re.search("([0-9]+)c", s)
    if str(gold) in 'None':
        gold = 0
    if str(silver) in 'None':
        silver = 0
    if str(copper) in 'None':
        copper = 0
    s = re.sub("[0-9]+g", "", s)
    s = re.sub("[0-9]+s", "", s)
    s = re.sub("[0-9]+c", "", s)
    assert (len(s.strip()) == 0) # should be 0

    return ((gold.group() * 10000 + silver.group() * 100 + copper.group())

如果返回的值是
None
,则只需检查None并将其替换为
0
。这似乎很适合你想做的事情

def money_from_string(s):
    gold = re.search("([0-9]+)g", s)
    silver = re.search("([0-9]+)s", s)
    copper = re.search("([0-9]+)c", s)
    if str(gold) in 'None':
        gold = 0
    if str(silver) in 'None':
        silver = 0
    if str(copper) in 'None':
        copper = 0
    s = re.sub("[0-9]+g", "", s)
    s = re.sub("[0-9]+s", "", s)
    s = re.sub("[0-9]+c", "", s)
    assert (len(s.strip()) == 0) # should be 0

    return ((gold.group() * 10000 + silver.group() * 100 + copper.group())

下面是我将如何实施你的计划

注:

  • 必须使用
    int()
    将字符串转换为整数
  • 我将验证与计算分开,但在这两种情况下使用相同的正则表达式
  • 我会用字典而不是代码来记录金属的价值
  • 通过对金属使用字符类,我只需调用
    re.findall()
    一次
  • 我的正则表达式允许一组更丰富的库存字符串,例如
    “10g 10g 10g”
    表示30个金币


下面是我将如何实施你的计划

注:

  • 必须使用
    int()
    将字符串转换为整数
  • 我将验证与计算分开,但在这两种情况下使用相同的正则表达式
  • 我会用字典而不是代码来记录金属的价值
  • 通过对金属使用字符类,我只需调用
    re.findall()
    一次
  • 我的正则表达式允许一组更丰富的库存字符串,例如
    “10g 10g 10g”
    表示30个金币


除了检查它是否为
None
并返回不同的内容之外,您还需要其他内容吗?
s
看起来像什么?我可以从你的代码中猜出来,但我不必担心它在成为pythonic之前是否正确。如果obj-else默认值为,为什么不直接使用
obj.attr呢?我得说这是一个很好的解释。或者您是在要求针对
re.search
的解决方案吗?另外,请注意
(gold.group()或0)
等将返回
str
int
。可能不是您想要的。除了检查它是否为
None
并返回不同的内容之外,您还想要其他内容吗?
s
看起来像什么?我可以从你的代码中猜出来,但我不必担心它在成为pythonic之前是否正确。如果obj-else默认值为
,为什么不直接使用
obj.attr呢?我得说这是一个很好的解释。或者您是在要求针对
re.search
的解决方案吗?另外,请注意
(gold.group()或0)
等将返回
str
int
。可能不是你想要的。是的,返回消息没有用,因为它对
gold.group()
没有帮助。谢谢。如果'None'中的str(gold)无效,因为'None'将被视为数组。gold.group()将返回一个包含字母“g”的字符串,当它确实存在并且不能乘以10000Yeah时,返回该消息没有用,因为它对
gold.group()没有帮助。
。谢谢。如果'None'中的str(gold)无效,因为'None'将被视为数组。gold.group()将返回一个包含字母“g”的字符串,如果该字符串确实存在并且不能乘以10000