如何修改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; Wine Merchant', 'Ristorante Umbria', 'flour + water', 'Firewood At Metreon', 'Palomino', 'Buono', 'Farina Focaccia &amp; Cucina Italiana',
你之前尝试的正则r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*.+^[&amp;])\n</a>\n'无效的原因:^[&amp;]写法错误,^在字符集内是取反,但放在.+之后,.+已经贪婪匹配到换行符,后续的^要求行首匹配指定字符,逻辑矛盾,因此无匹配结果。
两种可行解决方案
方案1:提取后批量替换(简单高效)
保留原提取正则,对结果中的&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;', '', name) for name in name_list] # 若要将转义字符还原为&,则替换为'&':re.sub(r'&amp;', '&', name) print("No of hotels=", len(cleaned_names)) print(cleaned_names)
方案2:修改正则直接匹配不含&amp;的内容
使用负向预查,确保匹配的名称内容中不包含&amp;,从根源避免提取该字符串:
import re # 使用(?:(?!&amp;).)*代替原有的.+,匹配任意字符但遇到& amp; amp;就停止 pattern_names = re.compile(r'\t(?P<Hotel_name>[a-zA-Z0-9][a-z0-9]*(?:(?!&amp;).)*)\n</a>\n') name_list = pattern_names.findall(data) print("No of hotels=", len(name_list)) print(name_list)
内容的提问来源于stack exchange,提问作者InquisitiveLearner
相关产品推荐
相关产品推荐

