[英]Python regex to match word before extension
我有以下链接列表:
['/directory/index.html',
'/index.html',
'#',
'/index.html',
'/kss_how.html',
'dr_info/swearingenlarry.html',
'dr_info/swearingenlarrylast.html',
'dr_info/kingjohn.html',
'dr_info/kingjohnlast.html',
'dr_info/_coble.jpg',
'dr_info/coblebillielast.html',
'dr_info/netherystephen.jpg',
'dr_info/netherystephenlast.html',
'dr_info/rougeaupaul.jpg',
'dr_info/no_last_statement.html',
'dr_info/no_info_available.html',
'dr_info/no_last_statement.html',
'dr_info/no_last_statement.html']
我需要选择类似的链接
'dr_info/kingjohn.html'
从中跳过其余部分。
到目前为止,我只想出了效率很低的解决方案:
p_1 = re.compile('dr.*(?<!last).html')
p_1_links = list(filter(p_1.match, links))
p_2 = re.compile('dr.*(?<!statement).html')
p_2_links = list(filter(p_2.match, p_1_links))
p_3 = re.compile('dr.*(?<!available).html')
valid_links = list(filter(p_3.match, p_2_links))
这让我感到颤抖,我希望有人可以帮助我将其调整为一条线。
示例中的所需输出将如下所示:
['dr_info/swearingenlarry.html',
'dr_info/kingjohn.html']
仅以dr_info
并以html
结尾的链接没有以last
, no_last_statement
或no_info_available
采用
exceptions = ('last.html', 'statement.html', 'available.html')
links = [link for link in links if link.endswith('.html') and link.startswith('dr') and not link.endswith(exceptions)]
# => ['dr_info/swearingenlarry.html', 'dr_info/kingjohn.html']
参见Python演示
link.endswith('.html') and link.startswith('dr') and not link.endswith(exceptions)
过滤links
列表,保留所有以dr
开头,以.html
结尾且不以任何值结尾的链接在exceptions
元组中。
出于教育目的,正则表达式解决方案可能看起来像
rx = re.compile(r'dr.*(?<!last)(?<!statement)(?<!available)\.html')
links = list(filter(rx.fullmatch, links))
您不能在以|
分隔的单个回溯中使用这三个异常。 交替运算符,因为Python lookbehinds是固定宽度的 。 .fullmatch
方法将确保整个字符串与正则表达式匹配,因此不需要锚。
为避免匹配的链接,其中排除的单词紧接在dr
之后(如注释中所述 ),并假设您只想匹配完整链接,则可以使用以下模式:
^dr(?!.*(?:last|statement|available)).*\.html$
您可以使用否定的Lookahead(而不是否定的Lookbehind),以便可以使用替代。 尝试这样的事情:
dr(?:.(?!last|statement|available))*\.html
正则表达式演示 。
Python示例:
import re
links = ['/directory/index.html',
'/index.html',
'#',
'/index.html',
'/kss_how.html',
'dr_info/swearingenlarry.html',
'dr_info/swearingenlarrylast.html',
'dr_info/kingjohn.html',
'dr_info/kingjohnlast.html',
'dr_info/_coble.jpg',
'dr_info/coblebillielast.html',
'dr_info/netherystephen.jpg',
'dr_info/netherystephenlast.html',
'dr_info/rougeaupaul.jpg',
'dr_info/no_last_statement.html',
'dr_info/no_info_available.html',
'dr_info/no_last_statement.html',
'dr_info/no_last_statement.html']
p_1 = re.compile('dr(?:.(?!last|statement|available))*\.html')
p_1_links = list(filter(p_1.match, links))
print(p_1_links)
输出:
['dr_info/swearingenlarry.html', 'dr_info/kingjohn.html']
在线尝试 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.