Если в шаблоне присутствует одна или несколько групп, верните список групп; это будет список кортежей, если шаблон содержит более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого совпадения.
Обратите внимание, что чтобы заставить re.findall возвращать только совпадающие значения, вы обычно можете
удалите избыточные группы захвата (например, (a(b)c) -> abc)
преобразуйте все фиксирующие группы в не фиксирующие (то есть замените ( на (?:), если нет обратных ссылок, которые ссылаются на значения группы в шаблоне (тогда смотрите Ниже)
используйте re.finditer вместо этого ([x.group() for x in re.finditer(pattern, s)])
В вашем случае, findall вернул все захваченные тексты, которые были пустыми, потому что у вас есть \\ внутри r'' строкового литерала, который пытался соответствовать литералу \.
search останавливается, когда он находит первую сборку mach SRE_Match объекта и возвращает его, проверьте этот код:
import re
s = r'abc123d' pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+' m = re.search(pattern, s) print(m.string) # 'abc123d' print(m.group(0)) # REGEX matched 123 print(m.groups()) # there is only one group in REGEX (\.[0-9]*) will empy string tgis why it return (None,)
s = ', hello 3.1415926, this is my book' m2 = re.search(pattern, s) # ', hello 3.1415926, this is my book' print(m2.string) # abc123d print(m2.group(0)) # REGEX matched 3.1415926 print(m2.groups()) # the captured group has captured this part '.1415926'
findall ведет себя по-другому, потому что он не просто останавливается, когда находит первую строку, он продолжает извлекать до конца текста, но если REGEX содержит хотя бы одну группу захвата, то findall возвращает не совпадающую строку, а строку, захваченную группами захвата:
import re s = r'abc123d , hello 3.1415926, this is my book' pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+' m = re.findall(pattern, s) print(m) # ['', '.1415926']
первый element возвращает, когда был найден первый mach, который '123' был захвачен только группой захвата '', но второй element был захвачен во втором совпадении, '3.1415926' группа захвата соответствовала этой части '.1415926'.
Если вы хотите сделать так, чтобы findall возвращаемая строка совпадала, вы должны сделать все группы захвата () в вашем REGEX не захватывающие группы(?:):
import re s = r'abc123d , hello 3.1415926, this is my book' pattern = r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+' m = re.findall(pattern, s) print(m) # ['123', '3.1415926']