为什么这个正则表达式只捕获最后一位数字?

问题描述 投票:0回答:2

从我的代码中,应该很容易看到我要做什么

for path in glob.glob("orig_data/*.*"):
    pattern = ".*(\d+\.).*"
    new_name = re.sub(pattern, r'\1txt', path)
    copyfile(path, 'orig_data_renamed/'+new_name)

我只想保留紧跟在“。”之前的数字。文件名,但没有文件名。

这是示例输出

some_folder/asdf321428.txt
8.txt

问题显然是'+',但我不确定它想要什么。

python regex
2个回答
1
投票

也许,

(\S*?)(\d*)\.txt

可以在这里正常工作。

测试

import re

string = '''
some_folder/asdf321428.txt
8.txt
some_folder123/asdf321428.txt
'''

expression = r'(?m)(\S*?)(\d*)\.txt'


print(re.findall(expression, string))

输出

[('some_folder/asdf', '321428'), ('', '8'), ('some_folder123/asdf', '321428')]

[如果您想简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果需要,您还可以在this link中查看它如何与某些示例输入匹配。



1
投票

这里是re.sub解决方案,也使用字符串拆分。我们可以在分隔符/上分割输入路径,然后使用最后一个元素来获取数字。我们再次调用re.sub,以隔离出现在点之前的数字。

path = "some_folder/asdf321428.txt"
nums = re.sub(r'^.*?(\d+)\.\w+$', '\\1', path.split("/")[-1])
print(nums)

此打印:

321428
© www.soinside.com 2019 - 2024. All rights reserved.