繁体   English   中英

Python正则表达式在扩展前匹配单词

[英]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结尾的链接没有以lastno_last_statementno_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演示regex演示

您不能在以|分隔的单个回溯中使用这三个异常。 交替运算符,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM