Сопоставьте строку и замените оставшиеся символы - PullRequest
1 голос
/ 02 апреля 2020

Я хотел бы извлечь тип сервера из имени хоста и заменить оставшиеся символы подчеркиванием, чтобы затем использовать его с сопоставлением с шаблоном LIKE в SQLite

Мой начальный подход был примерно таким (это исключительный вывод):

>>> host = 'webus01'
>>> location = 'us'
>>> parts = list(host.partition(location))
>>> parts
['web', 'us', '01']
>>> parts[1] = "_" * len(parts[1])
>>> parts[2] = "_" * len(parts[2])
>>> "".join(parts) + ".%"
'web____.%'

Но это не сработает, если hostname начинается с или содержит location имя:

>>> host = 'utilityit01'
>>> pod = 'it'
>>> parts = list(host.partition(location))
>>> parts
['utilityit01', '', '']
>>> parts[1] = "_" * len(parts[1])
>>> parts[2] = "_" * len(parts[2])
>>> "".join(parts) + ".%"
'utilityit01.%'

Тогда я думаю, что будет лучше использовать RegEx, чтобы это совпадало только с location перед цифрами. Функция re.sub кажется хорошим кандидатом для этой задачи, но я не уверен, как заменить все символы вместо группы соответствия в целом:

>>> import re
>>> re.sub(r'it\d+.*', '_', 'utilityit01a')
'utility_'

вывод в этом случае должен быть: utility_____.%.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Вы можете найти сначала подстроку, которую хотите заменить, а затем заменить ее в зависимости от ее длины:

>>> import re
>>> host = 'utilityit01'
>>> substr = re.findall(r'it\d+.*', host)
>>> substr
['it01a']
>>> host.replace(substr[0], len(substr)*'_')
'utility_____'
1 голос
/ 02 апреля 2020

Похоже, вам нужно.

import re
print(re.sub(r'(it\d+.*)', lambda x: '_'*len(x.group(1))+".%" , 'utilityit01a'))
print(re.sub(r'(us\d+.*)', lambda x: '_'*len(x.group(1))+".%" , 'webus01'))

Вывод:

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