我需要在python中使用正则表达式提取介于和标记之间的文本。
示例:Customizable:<strong>Features Windows 10 Pro</strong> and legacy ports <b>including VGA,</b> HDMI, RJ-45, USB Type A connections.
为此,我正在做
pattern=re.compile("(<b>(.*?)</b>)|(<strong>(.*?)</strong>)")
for label in labels:
print(label)
flag=0
if(('Window'in label or 'Windows' in label) and ('<b>' in label or '<strong>' in label)):
text=re.findall(pattern, label)
print(text)
其中,labels是包含标签的此类html元素的列表。
预期的输出为['Features Windows 10','including VGA,']
取而代之的是:[('', 'Features Windows 10 Pro'), ('including VGA,', '')]
请帮助。预先感谢。
答案 0 :(得分:6)
需要BeautifulSoup吗?
from bs4 import BeautifulSoup
data = BeautifulSoup("""Customizable:<strong>Features Windows 10 Pro</strong> and legacy ports <b>including VGA,</b> HDMI, RJ-45, USB Type A connections""")
data.find_all('strong')[0].text
data.find_all('b')[0].text
输出
Features Windows 10 Pro
'including VGA,'
答案 1 :(得分:1)
第一个you should not use regexes to parse markup text。
话虽这么说,结果是设计。 re.findall
的文档对此非常明确(强调我的观点):
re.findall(模式,字符串,标志= 0)
以字符串列表形式返回字符串中所有不重复的模式匹配项。从左到右扫描该字符串,并以找到的顺序返回匹配项。如果该模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。 如果模式包含多个组,这将是元组列表。
您的模式包含2组,一组用于<b>
,一组用于<strong>
。您将获得两个元组,以便您知道匹配的组。
如果您不喜欢这样做,则可以使用finditer
来返回匹配对象。匹配对象上的group(0)
是匹配的字符串的一部分:
text = [m.group() for m in pattern.finditer(label)]