0

私は小さな python スクリプトをテストしており、その一部をより大きなスクリプトで使用します。基本的に、CSV ファイル (正規表現を含む) のフィールドを検索し、これを正規表現テストで使用しようとしています。その理由は (非常に奇妙なユースケースの一部) であり、スクリプトの代わりに CSV ファイルのメンテナンスが容易になります。私が次のことで欠けているものはありますか....

test.csv:

field0,field1,field2
foo,bar,"\d+\.\d+"
bar,foo,"\w+"

test.py (extraprintはテストに使用されます):

import sys
import re
import csv

input = sys.argv[1]
print input

reader = csv.reader(open('test.csv','rb'), delimiter=',', quotechar="\"")
for row in reader:
        print row
        value = row[0]
        print value
        if value in input:
                regex = row[2]
                print regex

                pat = re.compile(regex)
                test = re.match(pat,input)
                out = test.group(1)
                print out

" " のような値をスクリプトに渡すと、含まれているものを取得し、正規表現を使用してを抽出するfoo blah 38902462986.328946239846ことが期待されます。ただし、スクリプトを実行すると、次のようになります。foo\d+\.\d+38902462986.328946239846

foo blah 0920390239.90239029
['field0', 'field1', 'field2']
field0
['foo', 'bar', '\\d+\\.\\d+']
foo
\d+\.\d+
Traceback (most recent call last):
  File "reg.py", line 19, in <module>
    out = test.group(1)
AttributeError: 'NoneType' object has no attribute 'group'

本当に何が起こっているのかわからない。

PS Python は大きな世界であり、まだ学習中です。

4

1 に答える 1

1

ドキュメントによるとre.match、入力文字列の先頭に一致します。を使用する必要がありますre.search。また、後で再利用しない場合はコンパイルする必要はありません。ただ言ってtest = re.search(regex, input)ください。

あなたの例の正規表現では、キャプチャ グループがないため、.test.group(1)に一致があっても失敗しinputます。

import sys
import re
import csv

input = 'foo blah 38902462986.328946239846'

reader = csv.reader(open('test.csv','rb'), delimiter=',', quotechar="\"")
for row in reader:
    value = row[0]
    if value in input:
        regex = row[2]
        test = re.search(regex, input)
        print input[test.start():test.end()]

版画:

38902462986.328946239846
于 2012-10-17T11:48:25.403 に答える