i, j = string.find("the number 1298 even", "%d+") print(i,j) in above code, if use %d+ , 12,15 expected %d* , returns 1,0 . difference between 2 * accepts 0 value + accepts 1 or more. why returning 1,0 ? first, pattern %d+ matches 1 or more digits, , %d* matches 0 or more digits, in example, %d+ matches "1298" , while %d* matches empty string in beginning. 0 occurrence of digits can matched %d* , that's difference between + , * . second, index 1 , 0 empty string seems bit odd, makes sense. index 1 means beginning of string, end index of empty string, can't have 1 because mean match first character "t" , must less beginning index, 0 1 got. furthermore, return value of string.find() can used arguments string.sub() substring found. in call string.sub (s, i, j) , if i greater j , returns empty string.