代码之家  ›  专栏  ›  技术社区  ›  zachMade

正则表达式:需要有子字符串A,没有子字符串B,并且不能以子字符串C结尾

  •  1
  • zachMade  · 技术社区  · 7 年前

    在过去的几天里,我才刚刚开始使用regex,现在我很困惑。检查Google和Stack--寻找答案,但没有运气。。。

    给出以下列表:

    • district\u代码,
    • county\u district\u代码,
    • CoDis,
    • 距离,
    • Dist代码,
    • DistCode,
    • -
    • 教育服务区,
    • 地区
    • 地区名称,
    • 地区名称,
    • 县代码,

    我需要找到符合 全部的 以下标准:

    • 包含“dist”或“codis”
    • 不包含“name”
    • 不要以“地区”结尾

    从第一个列表中,你会看到破折号以外的项目应该被过滤掉,但我对忽略以“district”结尾的条目的第三个标准有问题。。。尽管我(可能不正确)使用了“district”的负面前瞻,但regex一直在捕捉“Education\u service\u district”和“district”。我使用的是Python 3.6.1,我能想到的最好的方法是以下内容(顺便说一句,我使用的是不区分大小写的标志)

    ^.*(dist|codis)(?!.*name).*(?!district$)$
    

    提前感谢您的帮助。以下是我正在使用的全部代码(以防我做了一些与regex无关的蠢事):

    import re
    
    sample = ["district_code", "county_district_code", "CoDis", "Dist", "Dist Code", "DistCode", "educational_service_district", "District", "District Name", 
    "DistrictName", "County Code"]
    
    regex = "^.*(dist|codis)(?!.*name).*(?!district$)$"
    regex = re.compile(regex, re.IGNORECASE)
    
    for x in sample:
        if re.match(regex, x):
            print('Regex query', regex, 'matched sample text', x)
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Will Barnwell user2481422    7 年前

    您的正则表达式似乎面临着这样一个问题:它与一行末尾“dist”中的“dist”相匹配,从而捕获dist并阻止负面展望找到该行结尾的dist。我们可以通过将所有负面的lookahead移到regex的开头来避免这种情况。

    ^(?!.*(?:name|district$)).*(dist|codis).*$
    

    https://regex101.com/r/dwfi7b/1

    注意:我在regex101中使用了多行标志,因为我将测试用例表示为一个换行分隔的列表,使用字符串数组和for循环可以避免这种需要。