正则表达式,匹配条带和捕获?

时间:2018-05-29 14:01:08

标签: python regex python-3.x

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

  • 从几个字符串开始
  • 如果它有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)

有没有办法只用1行捕获和剥离而不是搜索,匹配然后再进行修改?我在寻找效率和可读性。只是简单地说明要聪明并不是我想要的。也许这只是做到这一点的方式?

1 个答案:

答案 0 :(得分:1)

您可以使用方法作为TwoWay的替换参数,您可以将匹配的文本保存到变量中,如果要删除找到的匹配项,只需返回并清空字符串。

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

re.sub

请参阅regex demo

  • r"\s*\b(?:DBA|ATTN)\b.{2,}" - 0+空白字符
  • \s* - 字边界
  • \b - (?:DBA|ATTN)DBA子字符串
  • ATTN - 字边界
  • \b - 除LF符号以外的2个或更多字符,尽可能多。

以下是一个例子:

.{2,}

请参阅Python demo

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) 设为列表变量,然后val更有意义。