2016-06-21 29 views
0

使用正则表达式的文字删除CSS我有一个字符串,如:从在Python 3

"<p> 
<style type=""text/css""> 
P { margin-bottom: 0.08in; direction: ltr; widows: 2; orphans: 2; }A:link { color: rgb(0, 0, 255); } </style> 
</p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
    <font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">blablabla. </span></font></p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
<font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">tjatjatja</span></font><span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">tjetjetje</span><span style=""font-size: 12px; font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; background-color: rgb(238, 238, 238);"">.</span></p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
<span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">huehuehue</span></p> 
" 

我想删除第一个样式标签和它的内容。我有这样一个正则表达式:

([\s\S]*)<style type=""text\/css"">[\s\S]+<\/style>([\s\S]*) 

刚刚的第一个样式标签匹配,但是当我尝试与删除它在python:

re.sub(r'([\s\S]*)<style type=""text/css"">[\s\S]*</style>([\s\S]*)', r'\1\2', cell_text, flags=re.M) 

这是行不通的。我认为这要么是与团体打交道,要么是以多线的形式进行。有任何想法吗?

+0

如果可以使用更多'style'标签,至少必须使''\ s \ S] *'非贪婪('[\ s \ S] *?')。 – ClasG

+0

And ...我不是Python专家,但你的正则表达式有单引号 - 为什么2'“'在里面?我猜字符串有2,因为这是你如何在Python中转义引号,但不应该是必须在一个单引号字符串中,或​​者...? – ClasG

+0

不知道为什么示例数据包含引号。为了对抗它,我使用了包含正则表达式的原始字符串的单引号 – tjarles

回答

1

使用,而不是一个分析器:

from bs4 import BeautifulSoup 

string = """ 
<p> 
<style type=""text/css""> 
P { margin-bottom: 0.08in; direction: ltr; widows: 2; orphans: 2; }A:link { color: rgb(0, 0, 255); } </style> 
</p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
    <font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">blablabla. </span></font></p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
<font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">tjatjatja</span></font><span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">tjetjetje</span><span style=""font-size: 12px; font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; background-color: rgb(238, 238, 238);"">.</span></p> 
<p style=""font-variant: normal; font-style: normal; font-weight: normal""> 
<span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">huehuehue</span></p> 
""" 

soup = BeautifulSoup(string) 
[s.extract() for s in soup('style')] 
print soup 
+0

由于Beautifulsoup已经被导入,我正在考虑这样做。你的解决方案非常有效!谢谢! – tjarles

+0

@tjarles:很高兴帮助:) – Jan

+1

为什么downvote? – Jan

0

要使用正则表达式使用删除CSS这个正则表达式代码:

(?s)<style>(.*?)<\/style> 

要做到在Python中替换为“重”库做这样的事情这样的:

regex = '(?s)<style>(.*?)<\/style>' 
pattern = re.compile(regex) 
re.sub(pattern, whatYouWantToReplaceItWith, stringToReplace) 

下面是使用Python中的“重”库教程: http://www.tutorialspoint.com/python/python_reg_expressions.htm

+0

该链接不使用我的示例中的字符串。 g和正则表达式的例子,并输入它匹配的第一个标签。这是我不确定的替代部分。 – tjarles

0
 import re 
     text = "<p><style type=""text/css""> P { margin-bottom: 0.08in; direction: ltr; widows: 2; orphans: 2; }A:link { color: rgb(0, 0, 255); } </style></p> 
       <p style=""font-variant: normal; font-style: normal; font-weight: normal""><font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">blablabla. </span></font></p> 
       <p style=""font-variant: normal; font-style: normal; font-weight: normal""><font face=""Trebuchet MS, Arial, Verdana, sans-serif""><span style=""font-size: 12px; background-color: rgb(238, 238, 238);"">tjatjatja</span></font><span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">tjetjetje</span><span style=""font-size: 12px; font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; background-color: rgb(238, 238, 238);"">.</span></p> 
       <p style=""font-variant: normal; font-style: normal; font-weight: normal""><span style=""font-family: 'Trebuchet MS', Arial, Verdana, sans-serif; font-size: 12px; background-color: rgb(238, 238, 238);"">huehuehue</span></p>" 
     pattern = '[\s\S]*(<style type=""text\/css"">[\s\S]+<\/style>)[\s\S]*' 
     text = re.sub(pattern , '', text) 

现在的子方法将一个空字符串替换匹配的字符串,问题是你必须要根据你想从字符串中删除哪个组而不是角落找寻其他方式分组。