Как проанализировать PCI-адреса с помощью регулярных выражений? - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь найти надежный шаблон регулярных выражений для анализа адреса PCI из списка в sysfs.

Например:

s = "
# total 0
# drwxr-xr-x   7 root root    0 Mar 22 21:30 .
# drwxr-xr-x 121 root root    0 Mar 22 21:27 ..
# drwxr-xr-x   2 root root    0 Mar 22 21:27 0000:13:45.6:pcie001
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.5
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.6
# -r--r--r--   1 root root 4096 Mar 22 21:29 aer_dev_correctable
"
pattern = r'SOME MAGIC'
list_of_addrs = re.findall(pattern, s, re.MULTILINE)

, где я ожидаю list_of_addrs = ['0000:13:45.6:pcie001', '0000:12:34.5', '0000:12:34.6']

Пример, который я приблизительно пытаюсь кодировать как регулярное выражение:

# Starts with a set of 4 hex characters, [0-9a-fA-F]
# :
# Set of 2 hex characters
# :
# Set of 2 hex characters
# Set of 1 hex characters
# Until next whitespace

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Попробуйте шаблон r'\b(0{0,4}:\d{2}:\d{2}.\d:?\w*)'

Пример:

import re

s = """
# total 0
# drwxr-xr-x   7 root root    0 Mar 22 21:30 .
# drwxr-xr-x 121 root root    0 Mar 22 21:27 ..
# drwxr-xr-x   2 root root    0 Mar 22 21:27 0000:13:45.6:pcie001
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.5
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.6
# -r--r--r--   1 root root 4096 Mar 22 21:29 aer_dev_correctable
"""
pattern = r'\b(0{0,4}:\d{2}:\d{2}.\d:?\w*)'
list_of_addrs = re.findall(pattern, s, re.MULTILINE)
print(list_of_addrs)

Выход:

['0000:13:45.6:pcie001', '0000:12:34.5', '0000:12:34.6']
0 голосов
/ 24 марта 2020

Вход:

import re
s = """
# total 0
# drwxr-xr-x   7 root root    0 Mar 22 21:30 .
# drwxr-xr-x 121 root root    0 Mar 22 21:27 ..
# drwxr-xr-x   2 root root    0 Mar 22 21:27 0000:13:45.6:pcie001
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.5
# drwxr-xr-x   2 root root    0 Mar 22 21:30 0000:12:34.6
# -r--r--r--   1 root root 4096 Mar 22 21:29 aer_dev_correctable
"""

# Begins with 4 hex characters
# :
# 2 hex characters
# : 
# 2 hex characters
# .
# 1 decimal character
# 1 or more occurrences of anything other than whitespace
pattern = r'\b([0-9a-fA-F]{4}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}.\d{1}\S*)'
re.findall(pattern, s)

Выход:

['0000:13:45.6:pcie001', '0000:12:34.5', '0000:12:34.6']

См. Также: https://www.w3schools.com/python/python_regex.asp

...