【问题标题】:Python: Using regex stored in CSVPython:使用存储在 CSV 中的正则表达式
【发布时间】:2012-10-07 15:43:35
【问题描述】:

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

test.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'

不知道到底发生了什么。

P.S Python 是一个广阔的世界,仍在学习。

【问题讨论】:

  • 您的代码似乎识别不正确。如果 test 是 None 那么 re.match 失败(这就是失败时返回的内容)。这可能是因为 re.match 需要一个字符串作为第一个参数,而不是编译模式。

标签: python regex csv


【解决方案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

【讨论】:

  • 谢谢,成功了,可能是因为我之前使用过 match,所以我一直记在心里。
猜你喜欢
  • 1970-01-01
  • 2011-09-15
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多