2017-05-03 39 views
0

爲了學習的目的,我從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

你想要的最後一個號碼或最高號碼 –

回答

1

爲了滿足要求,你可以使用這個表達式:

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

1
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