2015-05-10 2 views
1

Это код, который я пытаюсь пропустить, который находится в нескольких строках. Удаление/**/из html с использованием python

/****/
if (window.bbcdotcom && bbcdotcom.slot) { bbcdotcom.slot('mpu', [1,2,3]); } /**/

Я попробовал BeautifulSoup, My Best of Knowledge и regex, но не смог заставить его работать правильно. Я начинаю в python & пытается получить некоторый контент с помощью RSS-канала & выполняет обработку естественного языка.

+0

Гарантировано, будут ли они на одной линии и не сломаны пробелами или чем-либо еще? –

+0

Наверное, нет. Также, пожалуйста, укажите код. –

+0

Они не в той же строке, и код тот же, что я представил здесь (кроме первой строки/**/comments). Спасибо за ответ. Я обработал свою проблему пакетом lxml. – gnknithin

ответ

0

Если вы можете гарантировать форматирование точно, как описано выше, то простое регулярное выражение будет достаточно:

"/\**/.*?/\**/" - в основном, слэш следуют некоторые звезды, а затем косую черту, после чего-либо вообще, вплоть до слэша, за которым следуют звезды и другая косая черта. Используйте re.sub, чтобы заменить это ничем, и вы удалите его из своего текста. См. Ниже, если весь текст находится в переменной text.

import re 

In [12]: re.sub("/\**/.*?/\**/", '', "/*****/ hi hello how are you /**/") 
Out[12]: '' 

In [13]: re.sub("/\**/.*?/\**/", '', "testing \n 1 2 3/*****/ hi hello how are y 
ou /**/ and more testing...") 
Out[13]: 'testing \n 1 2 3 and more testing...' 
+0

Спасибо, это мало помогает – gnknithin

2

Чтобы удалить комментарии (/*...*/), вы можете использовать

p = re.compile(r'(?s)/\*.*?\*/') 
result = re.sub(p, '', test_str) 

Чтобы удалить весь текст внутри /*...*/, вы можете использовать

p = re.compile(ur'(?s)/\*.*?\*/.*?/\*.*?\*/') 
result = re.sub(p, '', test_str) 

Complete sample code:

import re 
test_str = u"/****/\n\n  if (window.bbcdotcom && bbcdotcom.slot) {\n  bbcdotcom.slot('mpu', [1,2,3]);\n  }\n  /**/\n  " 
# REMOVE ALL BETWEEN COMMENTS AND THE COMMENTS THEMSELVES 
p = re.compile(r'(?s)/\*.*?\*/.*?/\*.*?\*/') 
result = re.sub(p, '', test_str) 
print "Result 1: " + result 
# REMOVE THE COMMENTS 
p = re.compile(r'(?s)/\*.*?\*/') 
result = re.sub(p, '', test_str) 
print "Result 2: " + result 

Вывод:

Result 1: 

Result 2: 

     if (window.bbcdotcom && bbcdotcom.slot) { 
     bbcdotcom.slot('mpu', [1,2,3]); 
     } 
+0

Обратите внимание, что регулярное выражение, предложенное в предыдущем ответе, также удалит все, что угодно, просто '//' (из-за '*' квантификатора, используемого после символьной звездочки), что может быть небезопасным: см. Https://regex101.com/r/kU1rL5/1. Мое предложение устраняет эту проблему, так как '*' требуется появляться хотя бы один раз. –

+0

@ Нить, это сработает для вас или вам нужна дополнительная помощь? –

+0

У меня была такая же проблема, используя ее. Итак, я просто перешел из регулярного выражения в lxml.by благодаря чему. – gnknithin

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