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

时间:2017-05-03 12:59:25

标签: python regex match

出于学习目的,我正在从 CodeFights 做一些正则表达式的挑战。现在,他们在更改内容方面有非常具体的规则以获得正确的结果。我用不同的方法解决了这个难题,我无法理解他们想要我做的事情。

问:返回不归零的给定字符串的第n个数字

示例

# 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

2 个答案:

答案 0 :(得分:2)

要满足要求,您可以使用此正则表达式:

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

首先,我寻找一个非数字,然后是n-1组数字+非数字(非捕获),然后最后我忽略所有零,并捕获其余的数字。但是,如果存在仅为零的数字,则忽略全零是一个坏主意,因为这将被忽略。我宁愿在数字中加入零。否则,可能需要更复杂的前瞻模式。

答案 1 :(得分:1)

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

(?:\d+\D+?){%d}匹配至少1位数,后跟至少0个其他字符,持续n-1次。然后匹配至少0个零,然后至少匹配一个数字(这就是你要找的)。