0

我只是在测试一个小的 python 脚本,我将在更大的脚本中使用它的一部分。基本上我正在尝试在 CSV 文件中查找一个字段(其中包含一个正则表达式),并在正则表达式测试中使用它。原因是(一个非常奇怪的用例的一部分)并且可以更轻松地维护 CSV 文件而不是脚本。以下是我缺少的东西....

测试.csv:

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

test.py (额外print用于测试):

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 回答