代码之家  ›  专栏  ›  技术社区  ›  sniperd Ali Ahmed

Regex,在匹配条和捕获上?

  •  1
  • sniperd Ali Ahmed  · 技术社区  · 6 年前

    我有一个代码的工作块,但有一些东西告诉我它不是最有效的。

    • 从一些字符串开始
    • 如果dba或attn后面至少有2个字符,则捕获dba或attn到行尾,不要查看下一个字符串
    • 把刚刚抓到的东西去掉

    我下面的内容似乎做得很好。

    import re
    
    alt_name = ""
    
    name1 = "JUST A NAME"
    name2 = "UNITED STATES STORE DBA USA INC"
    name3 = "ANOTHER FIELD"
    
    regex = re.compile(r"\b(DBA\b.{2,})|\b(ATTN\b.{2,})")
    if re.search(regex, name1):
        match = re.search(regex, name1)
        alt_name = match.group(0)
        name1 = re.sub(regex, "", name1)
    elif re.search(regex, name2):
        match = re.search(regex, name2)
        alt_name = match.group(0)
        name2 = re.sub(regex, "", name2)
    elif re.search(regex, name3):
        match3 = re.search(regex, name3)
        alt_name = match.group(0)
        name3 = re.sub(regex, "", name3)
    
    print(name1)
    print(name2)
    print(name3)
    print(alt_name)
    

    有没有一种方法来捕捉和剥离只有一行,而不是搜索,匹配,然后subbiting?我在寻找效率和可读性。我不想让自己变得聪明。也许这就是解决问题的方法?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    您可以将方法用作 re.sub 可以将匹配的文本保存到变量中,如果要删除找到的匹配,只需返回并清空字符串。

    但是,您必须重新编写模式以提高效率:

    r"\s*\b(?:DBA|ATTN)\b.{2,}"
    

    查看 regex demo .

    • \s* -0+空白字符
    • \b -单词边界
    • (?:DBA|ATTN) -或者 DBA ATTN 子字符串
    • \b -单词边界
    • .{2,} -尽可能多的2个或更多字符,而不是LF符号。

    下面是一个例子:

    import re
    
    class RegexMatcher:
        val = ''
        rx = re.compile(r"\s*\b(?:DBA|ATTN)\b.{2,}")
    
        def runsub(self, m):
            self.val = m.group(0).lstrip()
            return ""
    
        def process(self, s):
            return self.rx.sub(self.runsub, s)
    
    rm = RegexMatcher()
    name = "UNITED STATES STORE DBA USA INC"
    print(rm.process(name))
    print(rm.val)
    

    查看 Python demo .

    也许这更有意义 val 一个列表变量,然后 .append(m.group(0).lstrip()) .