Python - 你可以使用re.compile寻找两个字符串吗?

时间:2013-09-20 19:11:49

标签: python regex

我正在使用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并且只将两个字符串中的任何一个放在compile语句中,我只返回一组总计。我需要将两个组合并打印为“001”,“045”

4 个答案:

答案 0 :(得分:6)

如果我理解正确,您需要一个与'ttp_ws_sm_(\d+)_''ttpv1_(\d+)_'匹配的正则表达式吗?

您可以使用pipe character |

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

?:成为第一组non-capturing

>>> 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的答案以获得解释。

答案 1 :(得分:5)

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

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

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

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

这就是它(意外)在re.compile内工作的原因。将布尔表达式传递给re.compile并没有多大意义。

其次,目前还不清楚你在这里想要完成什么。单个正则表达式可能不合适或可能需要不同的捕获组。

答案 2 :(得分: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_']

答案 3 :(得分:0)

阅读文档:

  

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