首页 > 解决方案 > 正则表达式查找带有下划线和可选扩展名的文件

问题描述

这是为了工作,所以我更改了扩展名和文件以保护无辜者。

我正在从描述中解析文本,以查找格式为 word_here 的文件名,它可以根据需要包含任意数量的下划线以及可选的扩展名。我能够想出这个有效的正则表达式

测试 1

text = 'Some text here: * my_file_stuff.mat * other_file * third_file *'

FILE_REG_EX = r'([\w]+_+[\w]+\.*[py|mat]*)'
res = re.findall(FILE_REG_EX, text)

print(res)

输出 1

python test_regex.py

['my_file_stuff.mat', 'other_file', 'third_file']

问题是它不适用于这样的东西

测试 2

text = '|my_file|another_file.mat|O_HERES_ONE|_O_HERES_ANOTHER| | | |'

FILE_REG_EX = r'([\w]+_+[\w]+\.*[py|mat]*)'
res = re.findall(FILE_REG_EX, text)

print(res)

输出 2

python test_regex.py
['my_file|a', 'nother_file.mat|', 'O_HERES_ONE|', '_O_HERES_ANOTHER|']

我修改了我的正则表达式以包含竖线,这里

测试 3

text = '|my_file|another_file.mat|O_HERES_ONE|_O_HERES_ANOTHER| | | |'

FILE_REG_EX = r'([\w]+_+[\w]+\.*[py|plot]*)\|'
res = re.findall(FILE_REG_EX, text)

print(res)

输出 3

 python test_regex.py
['my_file', 'another_file.mat', 'O_HERES_ONE', 'O_HERES_ANOTHER']

这适用于第二个,但现在不适用于第一个。部分问题是我将搜索文本描述以查找文件所在的位置,并且我无法知道它将用于文件的格式,只是它们将以 MY_FILE_HERE01.py 的形式出现有或没有扩展名。

我尝试使用 not 符号来排除前后的竖线,但这似乎对两个字符串都是空的。

标签: pythonregexstring

解决方案


您可以将此正则表达式用于两种输入:

[a-zA-Z\d]+_\w+(?:\.(?:py|mat))?

正则表达式演示

正则表达式详细信息:

  • [a-zA-Z\d]+: 匹配 1+ 个字母或数字
  • _: 匹配下划线
  • \w+: 匹配 1+ 个单词字符
  • (?:\.(?:py|mat))?:可选匹配.py.mat

推荐阅读