Python/Regex - 匹配.#,#.在String中

Sco*_*t B 10 python regex

我可以使用什么正则表达式匹配".#,#." 在一个字符串中.它可能存在也可能不存在于字符串中.一些预期产出的例子可能是:

Test1.0,0.csv      -> ('Test1', '0,0', 'csv')         (Basic Example)
Test2.wma          -> ('Test2', 'wma')                (No Match)
Test3.1100,456.jpg -> ('Test3', '1100,456', 'jpg')    (Basic with Large Number)
T.E.S.T.4.5,6.png  -> ('T.E.S.T.4', '5,6', 'png')     (Doesn't strip all periods)
Test5,7,8.sss      -> ('Test5,7,8', 'sss')            (No Match)
Test6.2,3,4.png    -> ('Test6.2,3,4', 'png')          (No Match, to many commas)
Test7.5,6.7,8.test -> ('Test7', '5,6', '7,8', 'test') (Double Match?)
Run Code Online (Sandbox Code Playgroud)

最后一个不太重要,我只期望.#,#.会出现一次.我正在处理的大多数文件,我希望落入第一到第四个例子,所以我最感兴趣的是那些.

谢谢您的帮助!

nne*_*neo 3

要允许多个连续匹配,请使用lookahead/lookbehind:

r'(?<=\.)\d+,\d+(?=\.)'
Run Code Online (Sandbox Code Playgroud)

例子:

>>> re.findall(r'(?<=\.)\d+,\d+(?=\.)', 'Test7.5,6.7,8.test')
['5,6', '7,8']
Run Code Online (Sandbox Code Playgroud)

我们还可以根据需要使用前瞻来执行分割:

import re
def split_it(s):
    pieces = re.split(r'\.(?=\d+,\d+\.)', s)
    pieces[-1:] = pieces[-1].rsplit('.', 1) # split off extension
    return pieces
Run Code Online (Sandbox Code Playgroud)

测试:

>>> print split_it('Test1.0,0.csv')
['Test1', '0,0', 'csv']
>>> print split_it('Test2.wma')
['Test2', 'wma']
>>> print split_it('Test3.1100,456.jpg')
['Test3', '1100,456', 'jpg']
>>> print split_it('T.E.S.T.4.5,6.png')
['T.E.S.T.4', '5,6', 'png']
>>> print split_it('Test5,7,8.sss')
['Test5,7,8', 'sss']
>>> print split_it('Test6.2,3,4.png')
['Test6.2,3,4', 'png']
>>> print split_it('Test7.5,6.7,8.test')
['Test7', '5,6', '7,8', 'test']
Run Code Online (Sandbox Code Playgroud)