Python正则表达式找到第n个数字

问题描述:

为了学习的目的,我从CodeFights做了一些正则表达式挑战。现在他们在改变什么以获得正确结果方面有非常具体的规则。我用一种不同的方法解决了这个难题,我无法围绕他们希望我做什么。Python正则表达式找到第n个数字

问:返回给予串的第n个编号不被零的

例含铅随后在至少0其它字符

# I can only change ... to solve it 
# def nthNumber_asked(s, n): 
# pattern = ... 
# return re.match(pattern, s).group(1) 

# How I solved it 
def nthNumber_mine(s, n): 
    return re.findall(r'(0*)([0-9]+)', s)[n-1][1] 

s1 = "8one 003number 201numbers li-000233le number444" 
s2 = "LaS003920tP3rEt4t04Yte0023s3t" 

print(nthNumber_mine(s1, 4)) # Expected outcome = 233 
print(nthNumber_mine(s2, 4)) # Expected outcome = 4 
+0

什么是模式定义? – Rahul

+0

这就是我想要弄清楚的。 – Ludisposed

+0

你想要的最后一个号码或最高号码 –

为了满足要求,你可以使用这个表达式:

def nthNumber_asked(s, n): 
    pattern = "\D*(?:\d+\D+){" + str(n-1) + "}0*(\d+)" 
    return re.match(pattern, s).group(1) 

首先我找一个非数字,则n-1组数字+非数字(非捕获),然后最后我忽略所有零,并且捕获数字的其余部分。然而,忽略所有零是一个坏主意,如果有一个只有零的数字,那将被忽略。我宁愿在数字中包含零。否则,可能需要一个更复杂的预见模式。

+0

完美!非常感谢 – Ludisposed

def nthNumber_mine(s, n): 
    return re.search(r'(?:\d+.+?){%d}0*(\d+)' % (n-1), s).group(1) 

(?:\d+\D+?){%d}比赛至少1位数,为n-1次。然后至少有0个零匹配,然后至少有一个数字匹配(这就是你要找的)。

+0

对于少于n个数字的情况,您可能希望使用'\ D +'而不是'。*?'。 –

+0

@SebastianProske你是对的 – horcrux

+0

@Ludisposed当然,只需在正则表达式的开头添加'\ D *'。但为什么? – horcrux