我正在使用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”
答案 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