我在Python(2.7.9)的正则表达式中遇到了问题。
我正在尝试使用以下正则表达式剥离HTML <span>
标签:
re.sub(r'<span[^>]*>(.*?)</span>', r'\1', input_text, re.S)
(这个正则表达式读起来就是:匹配<span
,除了>
之外的任何字符,然后是一个>
,接着非贪婪地匹配任何字符,最后是一个</span>
,并使用re.S (re.DOTALL)使.
可以匹配换行符)
这似乎很好用,除非文本中有换行符。看起来在非贪婪匹配中,re.S (DOTALL)不适用。
这是测试代码;从text1中删除换行符,re.sub可以工作。将其放回,re.sub 将无法正常工作。将换行符放在<span>
标签外面,re.sub将可以正常工作。
#!/usr/bin/env python
import re
text1 = '<body id="aa">this is a <span color="red">test\n with newline</span></body>'
print repr(text1)
text2 = re.sub(r'<span[^>]*>(.*?)</span>', r'\1', text1, re.S)
print repr(text2)
为了对比,我编写了一段Perl脚本来完成相同的事情;正则表达式在这里的工作方式与我预期的相同。
#!/usr/bin/perl
$text1 = '<body id="aa">this is a <span color="red">test\n with newline</span></body>';
print "$text1\n";
$text1 =~ s/<span[^>]*>(.*?)<\/span>/\1/s;
print "$text1\n";
有什么想法吗?
经过测试,适用于Python 2.6.6和Python 2.7.9。