0

私はpython 2.7を使用しており、コードにこれがあります:regexp = re.compile('ttp_ws_sm_(\d)_')

これは、サンプルのようにループ内でさまざまな文字を検索します (3 番目のアンダースコアの後)。次のような文字列についても同じことを行う必要があります'ttpv1_(\d+)_'

私が試した2つのことは次のとおりです。

regexp = re.compile('ttp_ws_sm_(\d)_' or 'ttpv1_(\d+)_')

name = ('ttp_ws_sm_(\d+)_' or 'ttpv1_(\d+)_')
regexp = re.compile(name)

データの例を次に示します。

sample filheader row
date,ttp_ws_sm_001_01, , , , , , , , , , , ,117
date,ttp_ws_sm_001_blank, , , , , , , , , , , ,31
date,ttp_ws_sm_045_01, , , , , , , , , , , ,145
date,ttp_ws_sm_045_blank, , , , , , , , , , , ,55
date,ttp_ws_sm_057_blank, , , , , , , , , , , ,98
date,ttpv1_001_, , , , , , , , , , , ,67
date,ttpv1_001_01, , , , , , , , , , , ,67*e is 

完全なコードは次のとおりです。

from collections import defaultdict

import sys
import csv
import re
import os

#variables
output_path = '\\\\Isfs\\data$\\GIS Carto\TTP_Draw_Count'
source = '\\\\Isfs\\data$\\GIS Carto\TTP_Draw_Count'
name = ('ttp_ws_sm_(\d+)_' or 'ttpv1_(\d+)_')

def main():
    result = defaultdict(int)
    regexp = re.compile(name)

    with open(os.path.join(source, 'TTP_13_08.csv'), 'r') as f:
        rows = csv.reader(f)

        for row in rows:
            match = regexp.search(row[1])
            if match:
                result[match.group(1)] += int(row[13])

    for key, value in result.items():

         print ("Club %s %s" % (key, value))

if __name__ == '__main__':
    main()

名前を使用せず、両方の文字列のいずれかをコンパイル ステートメントに入れると、1 セットの合計のみが返されます。「001」、「045」の両方のセットを組み合わせて印刷する必要があります

4

4 に答える 4

9

私があなたを正しく理解していれば、次のいずれかに一致する正規表現が必要です'ttp_ws_sm_(\d+)_''ttpv1_(\d+)_'?

パイプ文字|を使用できます:

re.compile(r'(?:ttp_ws_sm|ttpv1)_(\d+)_')

?:最初のグループを非キャプチャにします。

>>> pattern = re.compile(r'(?:ttp_ws_sm|ttpv1)_(\d+)_')
>>> pattern.match('ttpv1_001_').group(1)
'001'
>>> pattern.match('ttp_ws_sm_045_blank').group(1)
'045'

'ttp_ws_sm_(\d+)_' or 'ttpv1_(\d+)_'実際には と同じなので機能しません'ttp_ws_sm_(\d+)_'。説明については、マックスの回答を参照してください。

于 2013-09-20T19:15:40.063 に答える
5

Python の本を読む必要があります。あなたは言語についていくつかの深刻な誤解を持っています。

'ttp_ws_sm(\d+)_' or 'ttpv1_(\d+)_'

ブール式です。Python は空でない文字列を真であると解釈するため、これを (真か真か) と解釈します。Boolean の or の最初の部分が true の場合、Python は 2 番目の部分を調べず、最初の部分だけを返します。見て:

('foo' or 'bar') == 'foo'
>>> True

そのため、(偶然) 内部で動作しre.compileます。ブール式を に渡すことは、re.compileあまり意味がありません。

第二に、ここで何を達成しようとしているのかさえ明確ではありません。単一の正規表現は適切でないか、別のキャプチャ グループが必要になる可能性があります。

于 2013-09-20T19:24:28.590 に答える
1

ドキュメントを読む:

'|'
A|B (A と B は任意の RE にできます) は、A または B のいずれかに一致する正規表現を作成します。
http://docs.python.org/2/library/re.html#regular-expression-syntax

ドキュメントを読む:

csv.reader(csvfile, dialect='excel', **fmtparams)
(...)
csvfile がファイル オブジェクトの場合、違いが生じるプラットフォームでは 'b' フラグを指定して開く必要があります。
http://docs.python.org/2/library/csv.html#module-csv

于 2013-09-20T23:30:57.523 に答える
0
>>> line = 'date,ttp_ws_sm_001_01, , , , , , , , , , , ,117 date,ttp_ws_sm_001_blank, , , , , , , , , , , ,31 date,ttp_ws_sm_045_01, , , , , , , , , , , ,145 date,ttp_ws_sm_045_blank, , , , , , , , , , , ,55 date,ttp_ws_sm_057_blank, , , , , , , , , , , ,98 date,ttpv1_001_, , , , , , , , , , , ,67 date,ttpv1_001_01, , , , , , , , , , , ,67*e'
>>> name = re.compile(r'(?:ttp_ws_sm\d+_)|(?:ttpv1_\d+_)')
>>> name.findall()
>>> ['ttp_ws_sm_001', 'ttp_ws_sm_045', 'ttp_ws_sm_045', 'ttp_ws_sm_057', 'ttpv1_001_', 'ttpv1_001_']
于 2013-09-20T19:32:24.643 に答える