[英]Why is this regular expression only capturing the last digit?
從我的代碼中應該很容易看出我正在嘗試做什么
for path in glob.glob("orig_data/*.*"):
pattern = ".*(\d+\.).*"
new_name = re.sub(pattern, r'\1txt', path)
copyfile(path, 'orig_data_renamed/'+new_name)
我只想保留“。”之前的數字。 文件名,但它沒有。
這是一個例子 output
some_folder/asdf321428.txt
8.txt
問題顯然出在“+”上,但我不確定它想要什么。
也許,
(\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的右上角面板上進行了解釋。 如果您願意,您還可以在此鏈接中觀看它如何與一些示例輸入匹配。
這是一個re.sub
解決方案,也使用字符串拆分。 我們可以在分隔符/
上拆分輸入路徑,然后使用最后一個元素來獲取數字。 我們再次調用re.sub
以隔離出現在點之前的數字。
path = "some_folder/asdf321428.txt"
nums = re.sub(r'^.*?(\d+)\.\w+$', '\\1', path.split("/")[-1])
print(nums)
這打印:
321428
如果您只想要文件名,請嘗試此版本:
path = "some_folder/asdf321428.txt"
nums = re.sub(r'^.*?(?=\d+\.\w+$)$', '', path.split("/")[-1])
print(nums)
你是說你想保留數字,但你用re.sub
做的是替換數字。 您要做的是:按模式查找,然后取第一個匹配項(請自行處理錯誤)
new_name = re.findall(pattern, path)[0] + "txt"
Output:
321428.txt
另外,如果您想獲取點之前的所有數字,只需將模式更改為:
pattern = r"\D(\d+\.)"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.