Python中正则表达式匹配结果不一致。

3

我有一段使用正则表达式打印两个文件中匹配项的代码:

with open('ipCountry_list.txt','r') as csvfile1, open('city.txt', 'r', encoding="utf8" ) as file1:
    with open('unmatch.txt', 'a+') as file2:
        readCS = csv.reader(csvfile1, delimiter=';')
        reader = file1.readlines()
        for row in readCS:
            for line in reader:
                if all(re.findall(fr"\b{word}\b[^ ]", line, re.IGNORECASE) for word in row[:2]):
                    print(str(row) + line)
                    file2.write(str(row) + line)
                    break
                if all(re.findall(fr"\b{word}\b[^ ]", line, re.IGNORECASE) for word in row[:3]):
                    print(str(row) + line)
                    file2.write(str(row) + line)
                    break

输出:

['TH', 'BANGKOK']'TH~10~Bangkok'
['ES', 'VALENCIA']'ES~VC~Valencia'
['US', 'AZ', 'PHOENIX']'US~AZ~Aguila'
['JP', 'KASHIWA']'JP~12~Kashiwa'
[CZ;PRAGUE 4 - aaa]

如果你看到 ['US', 'AZ', 'PHOENIX']'US~AZ~Aguila' 不匹配。

[CZ;PRAGUE 4 - aaa] 应该和 'CZ~10~Prague' 匹配,但是无法匹配。

我不确定我做错了什么,也许是我的正则表达式有问题?

编辑:

ipCountry_list.txt:

    TH;BANGKOK;aaa
    ES;VALENCIA;aaa
    US;AZ;PHOENIX;aaa
    JP;KASHIWA;aaa
    CZ;PRAGUE 4 - aaa;
    ZA;EAST LONDON;aaa
    GB;BRIDGWATER;aaa
    RU;MOSCOW;aaa
    GH;TEMA;aaa

city.txt:

    'TH~10~Bangkok'
    'ES~VC~Valencia'
    'US~AZ~Aguila'
    'US~AZ~Phoenix'
    'JP~12~Kashiwa'
    'GB~ENG~Bridgwater'
    'ZA~EC~East London'
    'RU~MOW~Moscow'
    'GH~AA~Tema'
    'CZ~10~Prague'

评论不适合进行长时间的讨论;此对话已被移至聊天室 - Samuel Liew
1个回答

0
最后,我建议这段代码作为答案:
import csv
import re

with open('ipCountry_list.csv', 'r') as csvfile1, open('city.txt', 'r', encoding="utf8") as file1:
    with open('unmatch.txt', 'a+') as file2:
        readCS = csv.reader(csvfile1, delimiter=';')
        reader = file1.readlines()
        # Fallback for the case when city.txt line
        # has no trailing newline. For example, it
        # can happen for the last line. But in the case
        # when every line has a newline, the code line
        # should be removed.
        reader = tuple(map(lambda line: line.strip('\n') + '\n', reader))
        for row in readCS:
            for line in reader:
                ready_row = row[:3] if len(row) > 3 else row[:2]
                ready_row = [re.sub(r'[ \d-]*aaa(?=$)', '', col)
                             if 'aaa' in col else col
                             for col in ready_row if col]
                if all(re.search(fr"\b{word}\b(?:[^ ]|$)", line,
                       re.IGNORECASE) for word in ready_row):
                    print(str(row) + line, end='')
                    file2.write(str(row) + line)
                    break

嗨,感谢您的输入!这是一个有效的解决方案。但它只给出了一个结果,在这个结果中有三个匹配行。所以美国似乎是固定的。我认为你绝对正确,第二个IF语句没有被执行,因此美国没有得到正确的匹配。 - user10676860
@sgt 我没有理解你提到的问题。对于被压缩的文件,它可以解决'CZ;PRAGUE 4 - aaa;''PHOENIX', 'aaa']'US~AZ~Aguila'的问题。其他匹配项也是一样的。此外,代码重复性得到了减少。 - Splitter
我一直在测试代码。不幸的是,我复制了我的问题,并且您的代码按照预期工作,确实是问题的完美答案。但是,不知何故,当我使用我的原始文件时,它似乎只在匹配3行时才打印。因此,像US这样的匹配确实有效,但似乎没有捕获其他任何内容。 - user10676860
@sgt 那么您需要附上原始文件,如果可能的话。 - Splitter
嗨,splitter,谢谢你的回复。不幸的是,无法上传文件。我已将您的答案标记为正确,因为确实如此!谢谢! - user10676860

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接