10

「。#、#」に一致させるために使用できる正規表現は何ですか。文字列内。文字列に存在する場合と存在しない場合があります。期待される出力の例は次のとおりです。

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?)

最後のものはそれほど重要ではなく、私はそれだけを期待します。#、#。一度現れるでしょう。私が処理しているほとんどのファイルは、最初から4番目の例に分類されると予想されるので、それらに最も興味があります。

助けてくれてありがとう!

4

6 に答える 6

4

正規表現を使用し\.\d+,\d+\.てそのパターンのすべての一致を見つけることができますが、特に 2 つの一致として扱いたい場合は、期待する出力を得るために少し余分に行う必要があります.5,6.7,8.

1 つの潜在的な解決策を次に示します。

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'

于 2012-09-26T18:41:34.600 に答える
3

複数の連続した一致を許可するには、先読み/後読みを使用します。

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']
于 2012-09-26T18:45:41.283 に答える
0

これはかなり近いですが、Pythonは名前付きグループをサポートしていますか?

^.*(?P<group1>\d+(?:,\d+)?)\.(?P<group2>\d+(?:,\d+)?).*\..+$
于 2012-09-26T18:44:19.420 に答える
0

正規表現パターンを使用^([^,]+)\.(\d+,\d+)\.([^,.]+)$

このデモをチェック>>

>>> 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') 
[]
于 2012-09-26T18:38:53.120 に答える
0
^(.*?)\.(\d+,\d+)\.(.*?)$

これは、少なくともパターンでテストに合格します。

パターンでテストに合格する

于 2012-09-26T18:41:14.443 に答える
0
'/^(.+)\.((\d+,\d+)\.)?(.+)$/'

3 番目のキャプチャ グループには、数値のペアが含まれている必要があります。これらのペアが複数ある場合は、複数の一致が得られるはずです。そして、3 番目のキャプチャには常にペアが含まれます。

于 2012-09-26T18:40:37.110 に答える