2011-01-14 6 views
4

Я хочу, чтобы соответствовать слова, которые содержат специальные символы или которые начинаются с «HTTP: //»Регулярное выражение. Совпадение слова, содержащие специальные символы или «HTTP: //»

Так это предложение

% Нe # LLO, мой сайт: http://www.url.com/abcdef123

должен превратиться в эту

мой сайт

До сих пор, у меня есть этот

re.sub(r"^[^\w]", " ", "%he#llo, my website is: http://www.url.com/abcdef123") 

Это просто удаляет символы, но не удаляет слова, связанные с символом (он также не удаляет «:» и «»), а также не удаляет URL.

+1

Кстати, ваше название вопроса говорит «слова, которые начинаются со специальных символов», в то время как в тексте вопроса говорится «содержащие специальные символы». Возможно, вы захотите изменить заголовок, чтобы он был согласован. –

ответ

6

Для примера строки вы даете, следующее регулярное выражение работает нормально:

>>> a = '%he#llo, my website is: http://www.url.com/abcdef123' 
>>> re.findall('(http://\S+|\S*[^\w\s]\S*)',a) 
['%he#llo,', 'is:', 'http://www.url.com/abcdef123'] 

... или вы можете удалить эти слова с re.sub

>>> re.sub('(http://\S+|\S*[^\w\s]\S*)','',a) 
' my website ' 

| означает чередование и будет соответствовать выражению с обеих сторон внутри группы. Часть слева совпадает с http://, за которой следует один или несколько символов пробела. Часть справа совпадает с нулевым или более символом без пробела, за которым следует все, что не является символом слова или пробела, за которым следуют ноль или более непространственных символов, что гарантирует, что у вас есть строка с хотя бы одним не- символ слова и пробелы.

Обновлено: Конечно, как и другие ответы неявно предполагают, так как префикс http:// содержит не слово символ (/) вам не нужно иметь, что в качестве альтернативы - можно упростить регулярное выражение \S*[^\w\s]\S*. Однако, возможно, пример выше с чередованием по-прежнему полезен.

+0

Отлично работает! У меня есть еще один вопрос. Что, если я хочу сохранить все слова, которые заканчиваются (или просто содержат) знаки препинания? – user216171

+0

Вместо '[^ \ w \ s]' вы могли бы использовать '[^ \ w \ s",] ', чтобы сказать, что вы хотите сохранить слова, в которых есть '' 'или', '. например 're.sub ('(^ | \ s) (http: // \ S + | [^ \ w \ s",] \ S *)', '\\ 1', '% he # llo, my "so -called ", ну, веб-сайт: http: // www.url.com/abcdef123'' даст вам« мой »так называемый», ну, веб-сайт: « –

+0

@ user216171 Добро пожаловать. обратите внимание, что я случайно использовал другое (неправильное) регулярное выражение в этом комментарии, но сейчас слишком поздно исправлять его - во всяком случае, я надеюсь, что идея понятна ... –

2

Не использовать регулярные выражения, но возможно это может работать? (Я предполагаю, что ':' и '/' являются специальными символами, поэтому она будет удалять URL неявно)

def good_word(word): 
    import string 
    for c in word: 
     if not c in string.ascii_letters: 
      return False 
    return True 

def clean_string(str): 
    return ' '.join([w for w in input.split() if good_word(w)]) 

print clean_string("%he#llo, my website is: http://www.url.com/abcdef123") 
4

Вы можете использовать внешний вид aheads:

>>> re.findall(r"(?:\s|^)(\w+)(?=\s|$)", "Start %he#llo, my website is: http://www.url.comabcdef123 End") 
['Start', 'my', 'website', 'End'] 

Объяснение:

  • (?:\s|^) означает, что наше слово запускает регулярное выражение или предшествует пробелу. (а пространство не принадлежит слову).
  • (\w+) соответствует слову (и это то, что нас интересует).
  • (?=\s|$) означает, что за нашим словом следует пробел или конец строки. (и еще раз, пространство не принадлежит слову).
+0

Что делать, если слово содержит число? например web5site. Кажется, что слова, содержащие числа, все еще включены. –

Смежные вопросы