2015-07-21 58 views
0

我有以下字符串(阶段1):Python的正则表达式外文本与标签之间的结合文字

(Undergraduate level <A HREF="blah=">PHYS 218</A> Minimum Grade of D) and (Undergraduate level <A HREF="blah">MATH 152</A> Minimum Grade of D or Undergraduate level <A HREF="/blah=">MATH 172</A> Minimum Grade of D or Undergraduate level <A HREF="blah">MATH 251</A> Minimum Grade of D) 

从此我去(第2阶段):

(Undergraduate level PHYS 218 Minimum Grade of D) and (Undergraduate level MATH 152 Minimum Grade of D or Undergraduate level MATH 172 Minimum Grade of D or Undergraduate level MATH 251 Minimum Grade of D) 

然后最终我想要的是(阶段3):

(PHYS 218) and (MATH 152 or MATH 172 or MATH 251) 

目前我这样做的方式是可怕的。

我拿第1阶段字符串,完全删除所有a标签,并合并剩下的文本。

然后,我从a标签中取出课程编号,并将其从上述步骤中插入到字符串中以进入第二阶段。

我再去找在第二阶段的过程中,除去一切到左边和右边,直到我打了()orand

有没有什么办法可以干净地使用正则表达式或其他方式来做到这一点?谢谢。

回答

0
x="""(Undergraduate level <A HREF="blah=">PHYS 218</A> Minimum Grade of D) and (Undergraduate level <A HREF="blah">MATH 152</A> Minimum Grade of D or Undergraduate level <A HREF="/blah=">MATH 172</A> Minimum Grade of D or Undergraduate level <A HREF="blah">MATH 251</A> Minimum Grade of D)""" 
import re 
print re.sub(r"<[^>]*>\s*|Undergraduate level\s*|Minimum Grade of [A-Z]+","",x) 

如果格式总是固定不变,你可以用re.sub来完成。

查看演示。

https://regex101.com/r/hF7zZ1/2

编辑:

如果文本改变试试这个

x="""(Undergraduate level <A HREF="blah=">PHYS 218</A> Minimum Grade of D) and (Undergraduate level <A HREF="blah">MATH 152</A> Minimum Grade of D or Undergraduate level <A HREF="/blah=">MATH 172</A> Minimum Grade of D or Undergraduate level <A HREF="blah">MATH 251</A> Minimum Grade of D)""" 
import re 
print "".join(re.findall(r"(\(|\)|\s*or\s*|\s*and\s*|(?<=>)[^<]*(?=<\/A>))",x)) 
+0

这适用于给像你说的情况,但标签外的文本可以作为改变以及和/或组合。但是,谢谢。 –

+0

@ Random102你可以发布其他类型的字符串吗? – vks

+0

这里的其他两个我发现: '(本科水平CHEM 102最小的d或本科水平等级d的CHEM 104最低级)和(本科水平CHEM 112的d或本科水平最小等级d的CHEM 114最低级)和本科水平CHEM 227最低等级D' 和 '本科水平CHEM 117最低成绩D' –