RegEx для замены специальных шаблонов в списке - PullRequest
4 голосов
/ 15 мая 2019

Я работал над сценарием на python, чтобы чирикать некоторую информацию о своей дыре, и натолкнулся на небольшую проблему. Я не могу заставить re.sub работать на меня так, как я хочу.

Я пытаюсь выполнить вывод netifaces.interfaces(), что для меня равно ['lo', 'ens4', 'tun0', 'tun1'] и сделать его похожим на ens4, tun0, tun1

Я пытался использовать

netfaces = str(netifaces.interfaces())
netfaces = re.sub('\[|\'|lo|\'|\]', '', netfaces)

но это дает мне такой вывод:

, ens4, tun0, tun1 

редактирование:

спасибо @ четвертая птица

Я углубился в регулярное выражение, которое они дали, и пришел к этому

регулярное выражение

'lo'(?:,\s*)?|[][')(]|(?:,\s*)?'lo'

мой дубль:

'lo'(?:,\s*)? - ищет в строке 'lo', и удаляет независимо от того, были найдены

[][')(] - удаляет все ][ ' )( независимо от того, были найдены

(?:,\s*)?'lo' - удаляет все , 'lo' независимо от того, были найдены

, который также работает для os.getloadavg() вывода, который я тоже получаю

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Не ясно, почему вы сгенерировали эту строку, которая выглядит как список, но вы можете использовать это регулярное выражение,

^[^,]+,\s*|'|\]

и удалите его с пустой строкой, чтобы получить желаемую строку.

Поскольку вы хотите удалить только первую запятую и все, что перед ней, вам нужно ^[^,]+,\s*, а в остальных случаях вам также нужно удалить все кавычки, используя ' и ] с \]

Regex Demo

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

arr = ['lo', 'ens4', 'tun0', 'tun1']
arr.remove('lo')
print(', '.join(arr))

Печатает ваш предполагаемый вывод,

ens4, tun0, tun1
0 голосов
/ 15 мая 2019

Причина, по которой вы получаете такой результат, заключается в том, что вы сопоставляете 4 чередования, которые вы также можете записать как [][']|lo, но вы не сопоставляете запятую и пробел после нее, чтобы не удалить их.

Если вы хотите удалить 'lo' из списка, не оставляя запятую и пробел в начале, вы можете использовать:

'lo'(?:,\s*)?|[][']
  • 'lo'(?:,\s*)? Совпадение lo, за которым следует дополнительная часть для совпадения с запятой и 1+ пробелами
  • | или
  • []['] Соответствует любому из перечисленных в классе персонажей [, ], '

Заменить на пустую строку.

Regex demo | Демо Python

Например

import re
regex = r"'lo'(?:,\s*)?|[][']"
test_str = "['lo', 'ens4', 'tun0', 'tun1']"
result = re.sub(regex, "", test_str)

if result:
    print (result)

Результат

ens4, tun0, tun1
...