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()
- 我的正则表达式允许一组更丰富的库存字符串,例如
表示30个金币“10g 10g 10g”
下面是我将如何实施你的计划 注:
- 必须使用
将字符串转换为整数int()
- 我将验证与计算分开,但在这两种情况下使用相同的正则表达式
- 我会用字典而不是代码来记录金属的价值
- 通过对金属使用字符类,我只需调用
一次李>re.findall()
- 我的正则表达式允许一组更丰富的库存字符串,例如
表示30个金币“10g 10g 10g”
除了检查它是否为
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