我有一个工作的代码块,但有些东西告诉我它不是最有效的。
我在下面的内容似乎也很好。
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行捕获和剥离而不是搜索,匹配然后再进行修改?我在寻找效率和可读性。只是简单地说明要聪明并不是我想要的。也许这只是做到这一点的方式?
答案 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
更有意义。