我是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'
答案 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