RegEx для удаления не ASCII символов с обоих концов
Я должен зацикливаться несколько раз, используя этот код, есть ли лучший способ?
item = '[email protected]#$abc-123-4;5.def)(*&^;\n'
или же
'[email protected]#$abc-123-4;5.def)(*&^;\n_'
или же
'[email protected]#$abc-123-4;5.def)_(*&^;\n_'
Тот, который у меня как этот не работал
item = re.sub('^\W|\W$', '', item)
ожидать
abc-123-4;5.def
Конечная цель состоит в том, чтобы убрать только то, что не [a-zA-Z0-9]
с обоих концов, сохраняя при этом любые символы между ними. Первая и последняя буква в классе [a-zA-Z0-9]
Ответы
Ответ 1
Чтобы обрезать несловесные символы (верхний \W
) от начала/конца, а также добавить подчеркивание, которое принадлежит символам слова [A-Za-z0-9_]
вы можете [A-Za-z0-9_]
_
в класс символов вместе с \W
^[\W_]+|[\W_]+$
Смотрите демонстрацию на regex101. Это очень похоже на ответ @CAustin и комментарий @sln.
Чтобы получить обратную демоверсию и сопоставить все от первого до последнего буквенно-цифрового символа:
[^\W_](?:.*[^\W_])?
Или с чередованием демо (|[^\W_]
для строк, содержащих только один alnum).
[^\W_].*[^\W_]|[^\W_]
Оба с re.DOTALL
для многострочных строк. Regex ароматизаторы без try [\s\S]*
вместо .*
Demo
Ответ 2
Это выражение не ограничено слева, и оно может быть быстрее, если все ваши желаемые символы аналогичны примеру, который у вас есть в вашем вопросе:
([a-z0-9;.-]+)(.*)
Я предположил, что вы можете просто отфильтровать специальные символы в левой и правой части ваших входных строк.
Вы можете добавить больше символов и границ к этому выражению, и вы можете даже изменить его на более простое и быстрое выражение, если хотите.
Описательный график RegEx
Этот график показывает, как будет работать выражение, и вы можете визуализировать другие выражения по этой ссылке:
Если вы хотите добавить границы с правой стороны, вы можете просто сделать это:
([a-z0-9;.-]+)(.*)$
или даже вы можете перечислить ваши специальные символы как слева, так и справа в группе захвата.
Тест JavaScript
const regex = /([a-z0-9;.-]+)(.*)$/gm;
const str = '[email protected]#\$abc-123-4;5.def)(*&^;\\n';
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the 'm'-variable.
m.forEach((match, groupIndex) => {
console.log('Found match, group ${groupIndex}: ${match}');
});
}
Ответ 3
Вы можете сделать это, используя символ карата ^
в начале набора символов, чтобы отрицать его содержимое. [^a-zA-Z0-9]
будет соответствовать всему, что не является буквой или цифрой.
^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$
Ответ 4
Прежде всего, вы можете отключить некоторые особые случаи, удалив escape-символы:
item = re.sub(r'\\[abnrt]', '', item)
После этого давайте удалим символ _
из \W
, из того, что вы получите [^a-zA-Z0-9]
.
Ваше последнее регулярное выражение будет: (^[^a-zA-Z0-9]+)|([^a-zA-Z0-9]+$)
item = re.sub(r'(^[^a-zA-Z0-9]+)|([^a-zA-Z0-9]+$)', '', item)
Смотрите объяснение...
Здесь вы можете визуализировать ваше регулярное выражение...