如何编写正则表达式匹配字符串中.tar.gz后缀的文件名?
提取后缀为tar.gz的文件名
原始目标字符串
56451 -rw- 1 Aug 10 2023 08:54:53 +00:00 .callhome 56482 -rw- 14846 Jul 4 2023 23:02:34 +00:00 Router-system-report_20230704-230220-UTC-info.txt 56481 -rw- 68333650 Jul 4 2023 23:02:28 +00:00 Router-system-report_20230704-230220-UTC.tar.gz 233859 -rw- 9508 Jul 4 2023 17:47:54 +00:00 Router-system-report_20230704-174745-UTC-info.txt 56480 -rw- 61744940 Jul 4 2023 17:47:48 +00:00 Router- 56450 drwx 4096 Jun 18 2023 06:17:45 +00:00 modules
问题分析
你之前用的代码:
matches = re.finditer("(\w+)\s+(\d+)", file_string) for match in matches: filenames.append(match.group(1))
其中正则(\w+)\s+(\d+)匹配的是字母数字组合加空格加数字的片段,完全没触碰到每行末尾的文件名区域,自然拿不到目标的.tar.gz文件。
解决方案
可以用以下两种正则方案提取目标文件名:
方案1:通用匹配任意位置的.tar.gz文件
import re file_string = """56451 -rw- 1 Aug 10 2023 08:54:53 +00:00 .callhome 56482 -rw- 14846 Jul 4 2023 23:02:34 +00:00 Router-system-report_20230704-230220-UTC-info.txt 56481 -rw- 68333650 Jul 4 2023 23:02:28 +00:00 Router-system-report_20230704-230220-UTC.tar.gz 233859 -rw- 9508 Jul 4 2023 17:47:54 +00:00 Router-system-report_20230704-174745-UTC-info.txt 56480 -rw- 61744940 Jul 4 2023 17:47:48 +00:00 Router- 56450 drwx 4096 Jun 18 2023 06:17:45 +00:00 modules""" filenames = [] # 匹配任意非空白字符组成的、以.tar.gz结尾的文件名 matches = re.finditer(r"\b(\S+\.tar\.gz)\b", file_string) for match in matches: filenames.append(match.group(1)) print(filenames) # 输出: ['Router-system-report_20230704-230220-UTC.tar.gz']
方案2:精准匹配每行末尾的.tar.gz文件(贴合ls输出格式)
import re filenames = [] # 启用多行模式,匹配每行末尾、前面带空格的.tar.gz文件名 matches = re.finditer(r"\s+(\S+\.tar\.gz)$", file_string, re.MULTILINE) for match in matches: filenames.append(match.group(1)) print(filenames) # 输出: ['Router-system-report_20230704-230220-UTC.tar.gz']
正则规则说明
\S+:匹配1个及以上非空白字符,覆盖文件名中的连字符、下划线等特殊符号\.tar\.gz:转义.匹配实际的点号,精准锁定后缀\b:单词边界,避免匹配包含.tar.gz的更长字符串$+re.MULTILINE:在多行模式下,$匹配每行的末尾,确保只提取行尾的文件名
内容的提问来源于stack exchange,提问作者Akshay J
相关产品推荐
相关产品推荐

