使用Python中的正则表达式区分2个字符串

2024-03-29 09:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

mato_grosso_2000_test.csv
mato_grosso_do_sul_2000_test.csv

我想用python构建一个正则表达式,可以区分上面的两行。_20xx_test.csv总是出现在文件名中,xx的范围从0017我该怎么做?你知道吗

我尝试了一个简单的匹配,但这不能区分两个,即马托格罗索发现马托格罗索南

编辑:

我希望reg-ex测试选择mato_grosso_2000_test.csvmato_grosso_2001_test.csv,而不是mato_grosso_do_sul_2000_test.csv


Tags: csvtest编辑文件名regdoex区分
2条回答

我想你真正想要的是这样的东西:

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。你17岁。你知道吗

您可以使用带有否定前瞻断言的正则表达式来查找“mato\u grosso”后面不跟“do\u 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')

这会为第一个示例找到匹配项,但不会为第二个示例找到匹配项。你知道吗

Pythonre module文档详细讨论了正则表达式语法。做一个“消极的前瞻性”寻找更多的细节。你知道吗

相关问题 更多 >