Почему регулярное выражение не то, что я ожидаю? - PullRequest
1 голос
/ 02 мая 2019

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

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.].Где я не прав?Помогите пожалуйста.

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

Ответы [ 3 ]

1 голос
/ 02 мая 2019

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

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

['123.', '45.', '67.']
0 голосов
/ 02 мая 2019

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

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 голосов
/ 02 мая 2019

Вы должны удалить квантификатор {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 будет захватывать только последнее совпадение, равное 67. в вашем случае и, следовательно, печатает только это значение в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...