簡體   English   中英

為什么這個正則表達式只捕獲最后一個數字?

[英]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))

Output

[('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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM