如果第一个没有匹配,则匹配第二个正则表达式

时间:2014-10-12 06:17:27

标签: python regex

我试图在python中使用正则表达式在HTML标记之间提取文本。问题是有时字符串中没有HTML标记,所以我希望我的正则表达式匹配整个字符串。到目前为止,我已经获得了与标签内部文本匹配的部分:

(?<=>).*(?=<\/)

这将与下面标签中的俄罗斯匹配

<a density="sparse" href="http://topics.bloomberg.com/russia/">Russia</a>

或者,整个字符串将匹配:

Typhoon Vongfong prompted ANA to cancel 101 flights, affecting about 16,600 passengers, the airline said in a faxed statement. Japan Airlines halted 31 flights today and three tomorrow, it said by fax. The storm turned northeast after crossing Okinawa, Japan’s southernmost prefecture, with winds gusting to 75 knots (140 kilometers per hour), according to the U.S. Navy’s Joint Typhoon Warning Center.

否则我希望它返回字符串中的所有文本。

我已经在线阅读了一些有关正则表达式条件的内容,但我似乎无法让它们发挥作用。如果有人能指出我正确的方向,那将是伟大的。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你可以用一个正则表达式来做到这一点。你不需要采取任何解决方法。

>>> import re
>>> s='<a density="sparse" href="http://topics.bloomberg.com/russia/">Russia</a>'
>>> re.findall(r'(?<=>)[^<>]+(?=</)|^(?!.*?>.*?</).*', s, re.M)
['Russia']
>>> s='This is Russia Today'
>>> re.findall(r'(?<=>)[^<>]+(?=</)|^(?!.*?>.*?</).*', s, re.M)
['This is Russia Today']

答案 1 :(得分:0)

这是一个解决方法。我们不是调整正则表达式,而是调整字符串:

>>> s='<a density="sparse" href="http://topics.bloomberg.com/russia/">Russia</a>'
>>> re.findall(r'(?<=>)[^<>]*(?=<\/)', s if '>' in s else '>%s</' % s)
['Russia']
>>> s='This is Russia Today'
>>> re.findall(r'(?<=>)[^<>]*(?=<\/)', s if '>' in s else '>%s</' % s)
['This is Russia Today']