Python regex,在赛道上,抓捕?
我有一个工作代码块,但有些东西告诉我它不是最有效的Python regex,在赛道上,抓捕?,python,regex,python-3.x,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.
- 从几个字符串开始
- 如果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)
有没有一种方法可以用一条线来捕获和剥离,而不是搜索、匹配然后再细分?我在寻找效率和可读性。我的目的不是简明扼要地说聪明。也许这就是方法?您可以使用方法作为
re.sub
的替换参数,将匹配的文本保存到变量中,如果要删除找到的匹配项,只需返回空字符串即可
但是,必须重新编写模式以提高效率:
r"\s*\b(?:DBA|ATTN)\b.{2,}"
看
-0+空格字符\s*
-单词边界\b
-一个(?:DBA | ATTN)
或DBA
子字符串ATTN
-单词边界\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)
看
也许让val
成为一个列表变量,然后再.append(m.group(0.lstrip())
这是一个更好的正则表达式(我会使用它!),这是代码的其余部分。没有一种巧妙的python方法可以代替4行搜索、捕获和剥离,一行完成任务?不知道你的意思?本例使用了一个global
关键字,但您可以使用一个类变量。啊,val=m.group(0).lstrip()我想这就是我要寻找的。非常感谢。只有一个问题(?:DBA | ATTN)?:使其不捕获吗?虽然当我运行它时,它会捕获。@sniperd它是一个,它匹配,但不会捕获。