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;.-]+)(.*)

Я предположил, что вы можете просто отфильтровать специальные символы в левой и правой части ваших входных строк.

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

enter image description here

Описательный график RegEx

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

enter image description here

Если вы хотите добавить границы с правой стороны, вы можете просто сделать это:

([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)

Смотрите объяснение...

enter image description here

Здесь вы можете визуализировать ваше регулярное выражение...