gpt4 book ai didi

python - 正则表达式,在匹配条上并捕获?

转载 作者:行者123 更新时间:2023-12-01 09:24:03 26 4
gpt4 key购买 nike

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

  • 从几个字符串开始
  • 如果 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 行来捕获和剥离,而不是搜索、匹配然后进行字幕?我正在寻找效率和可读性。只是为了变得聪明而变得简短并不是我想要的。也许这只是做到这一点的方法?

最佳答案

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

但是,您所拥有的模式必须重写才能更有效:

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

请参阅regex demo .

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

这是一个例子:

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()) 更有意义。

关于python - 正则表达式,在匹配条上并捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50586304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com