出于学习目的,我正在从 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
答案 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个零,然后至少匹配一个数字(这就是你要找的)。