检查字符串是否符合从字符串中提取文本的条件-Regex

时间:2018-09-21 14:48:25

标签: python regex python-3.x

我是regex的新手,我没有一个字符串来提取所需的文本,但是,我还需要允许其他与regex不匹配的字符串在我的其他函数中进行迭代。

这是我要实现的目标:

我正在运行一个csv文件中的设备名称,如果它只有DeviceName而没有下面提到的字符串,它应该简单地将其返回给该函数并让其他函数来处理。 我要使用正则表达式的字符串将类似于

“在“ DeviceName”上的卡ADFGTR43567”,我只想从中提取 DeviceName

ADFGTR43567 是一个序列号,其中有11个字母,由数字和字母组成,没有固定位置。

这里的DeviceName可以是任何东西,例如EX:可以是ARIEFRETO002或ARIERDTOT5968.na.abc.com,甚至只是一个简单的mac地址,例如1234.abcd.5678 因此,即使字符串具有“ DeviceName上的卡序列号”之类的模式。

我希望它提取DeviceName并在我的代码中针对其他函数运行。如果我的csv中的设备名称没有这种模式,我仍然希望它提取它们并将其提供给其他功能。

我已经使用函数编写了代码,但是我不能在这里使用正则表达式。到目前为止,我只是尝试粘贴了必要的信息。

def validnames():
    idx = col[0].find('-')
    if idx > -1:
        user = col[0][idx + 1:idx + 4]
        if user.upper() in d:
            return col[0].split('.')[0]
        else:
            return 'Not Found'
    else:
        return 'Not Found'


def pingable():
    response = subprocess.Popen(['ping.exe', validnames()], stdout=subprocess.PIPE).communicate()[0]
    response = response.decode()
    if 'bytes=32' in response:
        status = 'Up'
        return status
    else:
        status = 'Down'
        return status

with open("Book2.csv", 'r') as lookuplist:
    for col in csv.reader(lookuplist):
        if validnames() == 'Not Found' : continue
        if pingable() == 'Down' : continue
        if validnames().lower() not in data:
            with open('Test.csv', 'a', newline='') as csvoutput:
                output = csv.writer(csvoutput)
                output.writerows([[validnames()]+[pingable()]])
                print("Device: %s" % validnames(), pingable())

def validnames():是一项功能,用于检查该设备是否符合ping操作的条件(基于条件)。我当时正在考虑将正则表达式放到该函数中,而我完全迷失了!)也许是另一个函数,但还不太了解如何使用正则表达式。

更新:这是我根据公认的答案集成两个功能的方式。

def regexfilter():
        try:
            rx = r'\bon\s+(\S+)'
            m = re.search(rx, col[0])
            if m:
                return m.group(1)
            else:
                return col[0]
        except:
            return col[0]


def validnames():
    idx = regexfilter().find('-')
    if idx > -1:
        user = regexfilter()[idx + 1:idx + 4]
        if user.upper() in d:
            return regexfilter().split('.')[0]
        else:
            return 'Not Found'
    else:
        return 'Not Found'

1 个答案:

答案 0 :(得分:0)

由于您要匹配on介词后的双引号内的任何文本,因此可以使用以下正则表达式:

\bon\s+(\S+)

请参见regex demo

详细信息

  • \b-单词边界
  • on-on
  • \s+-超过1个空格
  • (\S+)-捕获第1组:一个或多个非空白字符。

请参见Python demo

import re
rx = r'\bon\s+(\S+)'
s = "Card ADFGTR43567 on DeviceName"
m = re.search(rx, s)
if m:
    print(m.group(1)) # => DeviceName