Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python regex,在赛道上,抓捕?_Python_Regex_Python 3.x - Fatal编程技术网

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,}"

  • \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)

也许让
val
成为一个列表变量,然后再
.append(m.group(0.lstrip())

这是一个更好的正则表达式(我会使用它!),这是代码的其余部分。没有一种巧妙的python方法可以代替4行搜索、捕获和剥离,一行完成任务?不知道你的意思?本例使用了一个
global
关键字,但您可以使用一个类变量。啊,val=m.group(0).lstrip()我想这就是我要寻找的。非常感谢。只有一个问题(?:DBA | ATTN)?:使其不捕获吗?虽然当我运行它时,它会捕获。@sniperd它是一个,它匹配,但不会捕获。