Предложения по улучшению кода на языке Python для поиска строки с использованием выражения регулярного выражения - PullRequest
1 голос
/ 04 июня 2019

У меня есть блок кода для поиска определенного блока адреса и определенного форматирования результатов.

Например, у меня есть строка ввода "70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000".Мне нужно извлечь адреса между «BEG» и «END», которые в данном случае являются «701D135D» и «702D72FC», и отформатировать их следующим образом:

[0]0x701D135D  
[1]0x702D72FC  

Я написал скрипт для этой цели:

import re
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--address', help='Parse the input addresses')
args = parser.parse_args()
addressInfo = args.address

filter = re.compile(r'(BEG )((\w{8})\s)+(END )')
btInfo = filter.search(addressInfo)

print ("\n")
addresses = btInfo.group().split()
for idx in range(len(addresses)):
    if((addresses[idx] != 'BEG') and (addresses[idx] != 'END')):
        print ("[%d]0x%s" %(idx-1, addresses[idx]))

Когда я проверяю код, он больше похож на код на c / c ++, чем на python.Есть ли лучший способ достичь того же результата в «настоящем стиле питона»?

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

без re, но split() и с enumerate() для индексов:

def get_addresses(input_string):
    for address in input_string.split(' BEG ')[-1].split(' END ')[0].split(' '):
        yield address

foo = "70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000"
for idx, address in enumerate(get_addresses(foo)):
    print(f'[{idx}]0x{address}')
  • для использования f-строк требуется 3,6 +
1 голос
/ 04 июня 2019

Как насчет этого:

import re
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--address', help='Parse the input addresses')
addressInfo = parser.parse_args().address

btInfo = re.search(r' BEG (.*?) END ', addressInfo).group(1)
print("\n")

for index, address in enumerate(btInfo.split()):
    print("[{0}]0x{1}".format(index, address))

r'BEG (.*?) END ' получит все между BEG и END. А используя eumerate() в цикле for, вы можете циклически проходить через разделенную строку и одновременно отслеживать индекс.

Код выдаст следующий вывод:

[0]0x701D135D  
[1]0x702D72FC
0 голосов
/ 04 июня 2019

Использование re.search с Lookbehind & Lookahead и группировкой.

Ex

import re

s = "70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000"
m = re.search(r"(?<=\bBEG\b)(?P<address_1>.+) (?P<address_2>.+)(?=\bEND\b)", s)
if m:
    print(m.group("address_1").strip())
    print(m.group("address_2").strip())

Выход:

701D135D
702D72FC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...