0

我正在使用 python 2.7 并在我的代码中有一个:regexp = re.compile('ttp_ws_sm_(\d)_')

这会在我的循环中搜索与我的示例中不同的字符(在第三个下划线之后)。我也需要对像这样的字符串做同样的事情'ttpv1_(\d+)_'

我尝试过的两件事是:

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

如果我不使用 name 而只是将两个字符串中的任何一个都放在编译语句中,我只会返回一组总数。我需要将两组组合并打印为“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+)_'. 有关解释,请参阅 Max 的答案。

于 2013-09-20T19:15:40.063 回答
5

你应该读一本 Python 书。你对语言有一些严重的误解。

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

是一个布尔表达式。Python 将非空字符串解释为真,因此它将其解释为(真事或真事)。当布尔值 or 的第一部分为真时,Python 甚至不会查看第二部分,而只返回第一部分。看:

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