Я пытаюсь реализовать следующий код, но он печатает не то, что я ожидаю

import re

def regex_search(txt):
    lst = re.findall(r'(\d{1,3}\.){3}', txt)
    return lst

print(regex_search("123.45.67.89"))

Он печатает ['67. '], Когда я ожидаю [' 123. ', '45.', '67. ']. Где я не прав? Помоги пожалуйста.

Заранее спасибо.

1
Zarkos 2 Май 2019 в 10:28

3 ответа

Лучший ответ

Вы должны удалить квантификатор {3}, а также избавиться от лишней группировки и написать этот код,

import re

def regex_search(txt):
    lst = re.findall(r'\d{1,3}\.', txt)
    return lst

print(regex_search("123.45.67.89"))

Печатает ваш ожидаемый результат,

['123.', '45.', '67.']

Кроме того, поскольку вы использовали этот (\d{1,3}\.){3}, то он будет совпадать ровно с тремя из этих \d{1,3}\. многократно три раза, что будет 123.45.67. как целое совпадение, но group1 будет захватывать только последнее совпадение, которое is 67. в вашем случае и, следовательно, печатает только это значение в списке.

0
Pushpesh Kumar Rajwanshi 2 Май 2019 в 07:46

Я немного изменил ваше регулярное выражение, и теперь оно должно работать.

import re

def regex_search(txt):
    lst = re.findall(r'(\d{1,3}\.)', txt)
    return lst

print(regex_search("123.45.67.89"))

Выходной сейчас будет.

['123.', '45.', '67.']

Вы также можете сделать это без регулярных выражений, разделив на . и игнорируя последний элемент

import re

def regex_search(txt):
    items = txt.split('.')[:-1]
    return [item+'.' for item in items]

print(regex_search("123.45.67.89"))

На выходе будет

['123.', '45.', '67.']
0
Devesh Kumar Singh 2 Май 2019 в 07:32

Здесь нет необходимости даже использовать регулярные выражения:

input = "123.45.67.89"
parts = input.split(".")
parts = [s + "." for s in parts]
parts = parts[:-1]
print(parts)

['123.', '45.', '67.']
1
Tim Biegeleisen 2 Май 2019 в 07:38