You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python正则表达式去除酒店名称中的&

解决HTML中提取酒店名称时去除&的问题

问题背景

目前用Python正则从HTML中提取40个酒店名称,原正则能成功提取,但部分名称包含HTML转义后的&字符串。尝试修改正则时返回空列表,需要调整正则实现去除该字符串的需求,且不能使用BeautifulSoup等解析库。

原提取代码:

import re

pattern_names = re.compile(r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*.+)\n</a>\n')
name_list = pattern_names.findall(data)
print("No of hotels=", len(name_list))
name_list

提取结果示例(含转义字符):

"Rocco's Cafe",
'Local Kitchen &amp;amp; Wine Merchant',
'Ristorante Umbria',
'flour + water',
'Firewood At Metreon',
'Palomino',
'Buono',
'Farina Focaccia &amp;amp; Cucina Italiana',

你之前尝试的正则r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*.+^[&amp;amp;])\n</a>\n'无效的原因:^[&amp;amp;]写法错误,^在字符集内是取反,但放在.+之后,.+已经贪婪匹配到换行符,后续的^要求行首匹配指定字符,逻辑矛盾,因此无匹配结果。


两种可行解决方案

方案1:提取后批量替换(简单高效)

保留原提取正则,对结果中的&amp;amp;进行替换,无需修改匹配逻辑:

import re

pattern_names = re.compile(r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*.+)\n</a>\n')
name_list = pattern_names.findall(data)
# 替换掉所有& amp; amp;(去掉空格,此处为转义写法)
cleaned_names = [re.sub(r'&amp;amp;', '', name) for name in name_list]
# 若要将转义字符还原为&,则替换为'&':re.sub(r'&amp;amp;', '&', name)

print("No of hotels=", len(cleaned_names))
print(cleaned_names)

方案2:修改正则直接匹配不含&amp;amp;的内容

使用负向预查,确保匹配的名称内容中不包含&amp;amp;,从根源避免提取该字符串:

import re

# 使用(?:(?!&amp;amp;).)*代替原有的.+,匹配任意字符但遇到& amp; amp;就停止
pattern_names = re.compile(r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*(?:(?!&amp;amp;).)*)\n</a>\n')
name_list = pattern_names.findall(data)

print("No of hotels=", len(name_list))
print(name_list)

内容的提问来源于stack exchange,提问作者InquisitiveLearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:05:58