2011-10-15 57 views
2

我试图更改包含子字符串如Python正则表达式替换

the</span></p> 
<p><span class=font7>currency 

the currency 

在换行符的话前后CRLF

代码改变。如果第二个单词以小写字母开头,我只想替换它。改变代码的唯一的事情是“字体”

我试过后的数字:

p = re.compile('</span></p>\r\n<p><span class=font\d>([a-z])') 
res = p.sub(' \1', data) 

,但是这是不工作

我应该怎样解决这个问题?

+1

因为正则表达式不应该用来解析html。 – JBernardo

+0

除了@JBernardo你的问题还不清楚。如?还有什么? – FailedDev

+0

@FailedDev:编辑是否澄清? – foosion

回答

1

使用前瞻断言。

p = re.compile('</span></p>\r\n<p><span class=font\d>(?=[a-z])') 
res = p.sub(' ', data) 
+0

这似乎没有找到子字符串。 p.match(data)不返回 – foosion

+0

@foosion:从字符串的开头搜索'match'。尝试'p。搜索(数据)'。 –

1

此:

result = re.sub("(?si)(.*?)</?[A-Z][A-Z0-9]*[^>]*>.*</?[A-Z][A-Z0-9]*[^>]*>(.*)", r"\1 \2", subject) 

适用于:

the</span></p> 
<p><span class=font7>currency 

产地:

the currency 

虽然我会强烈建议不要使用正则表达式与XML/HTML/XHTML。这个通用正则表达式将删除所有元素,并在组1,2之前/之后捕获任何文本。

+0

html看起来倒过来的原因是你看到一个段落的结尾和另一个段落的开始。这个正则表达式看起来很复杂 – foosion

+0

@foosion这个正则表达式不管你投入什么元素都会工作。 – FailedDev

1

我认为你应该使用标志re.DOTALL,这意味着它将“看到”非换行字符,如换行符,就好像它们是常规字符一样。

所以,你的代码的第一行会变成:

p = re.compile('</span></p>..<p><span class=font\d>([a-z])', re.DOTALL) 

(不是两个转义点,而不是换行符)。

其实,还有re.MULTILINE,每次我遇到这样的问题最终都会解决问题。

希望它有帮助。

+0

似乎没有找到子字符串。 p.match(data)不返回任何内容。 – foosion