mato_grosso_2000_test.csv
mato_grosso_do_sul_2000_test.csv我想在python中构建一个正则表达式,它可以区分上面的两行。_20xx_test.csv总是出现在文件名中,xx可以从00到17不等,我该怎么做呢?
我尝试了一个简单的as匹配,但这不能区分两者,即mato_grosso也找到了mato_grosso_do_sul
编辑:
我希望reg测试选择mato_grosso_2000_test.csv和mato_grosso_2001_test.csv,而不是mato_grosso_do_sul_2000_test.csv
发布于 2017-01-24 06:34:45
我认为你真正想要的是这样的东西:
regions_to_files = defaultdict(list)
for x in filenames:
matches = re.match(r'(?P<region>.*)_(?P<year>200[0-9]|201[0-7])_test.csv', x)
region = matches.group('region')
regions_to_files[region].append(x)现在,与mato_grosso相关的所有文件将在regions_to_files['mato_grosso']上可用,而与mato_grosso_do_sul相关的所有文件将在regions_to_files['mato_grosso_do_sul']上可用。
匹配第一个文件名:
# mato_grosso_2000_test.csv
re.match(r'mato_grosso_20(0[0-9]|1[0-7])_test.csv', filename)匹配第二个文件名,但不匹配第一个文件名:
# mato_grosso_do_sul_2000_test.csv
re.match(r'mato_grosso_do_sul_20(0[0-9]|1[0-7])_test.csv', filename)正则表达式(0[0-9]|1[0-7])将匹配00,01,。。。是给你的。
发布于 2017-01-24 06:34:10
可以使用带有负前瞻性断言的regex查找"mato_grosso“的匹配项,而不是"do_sul”。例如:
re.match('mato_grosso_(?!do_sul)', 'mato_grosso_2000_test.csv')
re.match('mato_grosso_(?!do_sul)', 'mato_grosso_do_sul_2000_test.csv')这将为第一个示例找到匹配,但对于第二个示例却找不到匹配。
Python文档有更多关于正则表达式语法的讨论。要获得更多有关这方面的详细信息,请查找“负面展望”。
https://stackoverflow.com/questions/41821397
复制相似问题