我可以使用什么正则表达式匹配“。#,#。”在一个字符串中。它可能存在也可能不存在于字符串中。预期输出的一些例子可能是:
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?)
最后一个并不太重要,我只希望如此。#,#。会出现一次。我正在处理的大多数文件,我希望它们属于第一到第四个例子,所以我对这些文件最感兴趣。
感谢您的帮助!
答案 0 :(得分:4)
您可以使用正则表达式\.\d+,\d+\.
查找该模式的所有匹配项,但是您需要多做一点才能获得预期的输出,特别是因为您希望将.5,6.7,8.
视为两个匹配。
这是一个潜在的解决方案:
def transform(s):
s = re.sub(r'(\.\d+,\d+)+\.', lambda m: m.group(0).replace('.', '\n'), s)
return tuple(s.split('\n'))
示例:
>>> transform('Test1.0,0.csv')
('Test1', '0,0', 'csv')
>>> transform('Test2.wma')
('Test2.wma',)
>>> transform('Test3.1100,456.jpg')
('Test3', '1100,456', 'jpg')
>>> transform('T.E.S.T.4.5,6.png')
('T.E.S.T.4', '5,6', 'png')
>>> transform('Test5,7,8.sss')
('Test5,7,8.sss',)
>>> transform('Test6.2,3,4.png')
('Test6.2,3,4.png',)
>>> transform('Test7.5,6.7,8.test')
('Test7', '5,6', '7,8', 'test')
要在没有匹配项时将文件扩展名拆分,您可以使用以下命令:
def transform(s):
s = re.sub(r'(\.\d+,\d+)+\.', lambda m: m.group(0).replace('.', '\n'), s)
groups = s.split('\n')
groups[-1:] = groups[-1].rsplit('.', 1)
return tuple(groups)
除了'Test2.wma'
变为('Test2', 'wma')
,'Test5,7,8.sss'
和'Test5,7,8.sss'
具有相似的行为外,这与上面的输出相同。
答案 1 :(得分:3)
要允许多个连续匹配,请使用lookahead / lookbehind:
r'(?<=\.)\d+,\d+(?=\.)'
示例:
>>> re.findall(r'(?<=\.)\d+,\d+(?=\.)', 'Test7.5,6.7,8.test')
['5,6', '7,8']
我们也可以使用前瞻来根据需要执行拆分:
import re
def split_it(s):
pieces = re.split(r'\.(?=\d+,\d+\.)', s)
pieces[-1:] = pieces[-1].rsplit('.', 1) # split off extension
return pieces
测试:
>>> 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']
答案 2 :(得分:0)
使用正则表达式^([^,]+)\.(\d+,\d+)\.([^,.]+)$
检查this demo&gt;&gt;
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test1.0,0.csv')
[('Test1', '0,0', 'csv')]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test2.wma')
[]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test3.1100,456.jpg')
[('Test3', '1100,456', 'jpg')]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'T.E.S.T.4.5,6.png')
[('T.E.S.T.4', '5,6', 'png')]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test5,7,8.sss')
[]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test6.2,3,4.png')
[]
>>> print re.findall(r'^([^,]+)\.(\d+,\d+)\.([^,.]+)$', 'Test7.5,6.7,8.test')
[]
答案 3 :(得分:0)
'/^(.+)\.((\d+,\d+)\.)?(.+)$/'
第三个捕获组应包含这对数字。如果你有多个这样的对,你应该得到多个匹配。而第三次捕获将始终包含该对。
答案 4 :(得分:0)
^(.*?)\.(\d+,\d+)\.(.*?)$
这会通过您的测试,至少在模式中:
答案 5 :(得分:0)
这非常接近,python是否支持命名组?
^.*(?P<group1>\d+(?:,\d+)?)\.(?P<group2>\d+(?:,\d+)?).*\..+$