Редактировать
# 1
То же, что и ниже, но намного короче, я определяю символы, которые должны предшествовать захваченным, все в одном наборе
>>> import re
>>> text = 'Must-have skills: -.Net programming experience; -2 years experience in C++; C#/.Net, C++/.Net, C./.Net.'
>>> re.sub('(?:(?<!\S)|(?<=[\s\+\.C#]))[\-!,.:;—/]|[\-!,.:;—/](?=\s|$)', ' ', text)
#Output
'Must-have skills .Net programming experience 2 years experience in C++ C# .Net C++ .Net C .Net '
.
Объяснение
- Ответ здесь фактически совпадает с ответом, приведенным ниже, но вместо того, чтобы объявлять символы, которые должны предшествовать захваченному набору, которые будут действовать один за другим, я определяю их всех в одном наборе.
.
# 2
Вид действительно грязного раствора, но
Выложу объяснение позже; может даже улучшить его для лучшей читаемости
>>> import re
>>> text = 'Must-have skills: -.Net programming experience; -2 years experience in C++; C#/.Net, C++/.Net, C./.Net.'
>>> re.sub('(?:(?<!\S)|(?<=\s)|(?<=\+)|(?<=\.)|(?<=C)|(?<=#))[\-!,.:;—/]|[\-!,.:;—/](?=\s|$)', ' ', text)
#Output
'Must-have skills .Net programming experience 2 years experience in C++ C# .Net C++ .Net C .Net '
.
Редактировать: Объяснение
- Итак, открывая с помощью
(?:
, я открываю, говоря, что запросу, который я хочу захватить, в этом случае должен предшествовать набор перехвата, который содержит все, что определено непосредственно за (?:
.
- Ключевым моментом здесь является то, что указатели, начинающиеся с
(?<!
и (?<=
, не могут быть установлены так, чтобы игнорировать диапазон значений, поэтому я должен сначала начать с (?:
, а затем дать несколько (?<!
и (?<=
означает, что захваченному должен или не должен предшествовать этот символ, а НЕ предшествовать этому другому символу и т. Д. И т. Д.
- Итак, открыв с помощью
(?:
, я теперь могу установить значения, которым должно быть или не должно предшествовать то, что захватывается
- Начиная с
(?<!\S)
, это действительно не нужно, но я включил его, потому что он бросает страховочную сетку. В основном говорится, что диапазон [\-!,.:;—/]
НЕ должен быть захвачен / задействован, если ему предшествует какой-либо случайный непробельный символ
- С
|(?<=\s)
Я говорю, что * ИЛИ [\-!,.:;—/]
должен быть захвачен / активирован, если ему предшествует какой-либо один символ пробела
- С
|(?<=\+)|(?<=\.)|(?<=C)
Я говорю ИЛИ [\-!,.:;—/]
должно быть захвачено / активировано, если ему предшествуют +,., Или C, , поэтому \. OR just . [a period]
в [\-!,.:;—/]
будет захватить / выполнить действие, если ему предшествует C
, как в вашей строке (помните (?<=C)
); и ;
в [\-!,.:;—/]
будет захвачено / выполнено, если ему предшествует +
(помните (?<=\+)
).
- Финальный
)
до |
закрытия (?:
.
|
как вы знаете, ИЛИ, и, поскольку я не могу сделать заявление «все в одном», я должен переопределить [\-!,.:;—/]
, а затем оглянуться на следующее: «1093 * Захватить / действовать на [\-!,.:;—/]
если за ним следуют пробел или конец строки. С помощью lookaheads вы можете определять обычные однорядные строковые типы 'диапазонов', чтобы вы могли фактически использовать OR statements
внутри них, но вы не можете при использовании lookaheads