내가 해결하려는 문제 :
s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c"""
s1 = """X3 InRXBytes=1257890123 X2 OutRXBytes=871625343 X5 OutRXBytes=71625343"""
위의 두 문자열을 예로 들어 보겠습니다. 각 문자열을 별도의 부분으로 나누고 싶습니다.
문자열 s의 경우
part1 = '''X8 ifInDiscards=14308c'''
part2 = '''X8 ifOutDiscards=133796c'''
문자열 s1의 경우
part1 = '''X3 InRXBytes= 1257890123'''
part2 = '''X2 OutRXBytes= 871625343'''
part3 = '''X5 OutRXBytes= 71625343'''
따라서 위의 두 문자열 예에서 볼 수 있듯이 분할 할 문자열 형식은 다음과 같습니다.
'''metric1=value1 metric2=value2....metricN=valueN'''
위의 예와 같이 메트릭 이름에 공백이있을 수 있습니다.
지금까지 이것이 내가 운없이 시도한 것입니다.
>>> s = """X8 ifInDiscards=14308c X8 ifOutDiscards=133796c"""
>>>
>>>
>>>
>>> s.split('=')
['X8 ifInDiscards', '14308c X8 ifOutDiscards', '133796c']
>>>
문제는 가장 효율적인 방법으로 문자열을 어떻게 분할합니까? 운없이 시도한 또 하나의 접근법이 있습니다.
>>> s 'X8 ifInDiscards=14308c X8 ifOutDiscards=133796c'
>>> pattern = r'''[0-9a-zA-Z]?=[0-9a-zA-Z]? [0-9a-zA-Z]?=[0-9a-zA-Z]?'''
>>> re.search(pattern, s)
메트릭 이름은 가변 길이 일 수 있으며 여러 공백을 포함 할 수 있습니다 ....
마지막 편집 : 다음은 문자열 's'에만 작동하지만 문자열 's1'에는 작동하지 않는 것으로 보이는 최종 접근 방식입니다.이 작업을 수행하는 더 좋은 방법이 있는지 알고 싶습니다.
>>> pattern = r'''([0-9a-zA-Z ].*?=[0-9a-zA-Z ].*?) ([0-9a-zA-Z ].*?=[0-9a-zA-Z ].*)'''
>>> s
'X8 ifInDiscards=14308c X8 ifOutDiscards=133796c'
>>> re.search(pattern, s).groups()
('X8 ifInDiscards=14308c', 'X8 ifOutDiscards=133796c')
의 결과를 보면 s.split('=')
각 값 N-1 다음에 메트릭 N이 있음을 알 수 있습니다. 그리고 값은 공백을 허용하지 않지만 행렬 이름은 허용하므로 각 요소를 다음으로 분할하는 방법은 모호하지 않습니다. 가치와 측정 기준이 맞죠? 따라서 값 목록을 하나씩 이동하고 메트릭 목록으로 압축하면됩니다. 엣지 케이스를 염두에 두십시오 (첫 번째 케이스는 값이없고 마지막 케이스는 메트릭이 없음).이를 매우 쉽게 작성할 수 있어야합니다.
압축을 이해하지 못하는 경우 다음과 같이 명시 적으로 수행 할 수도 있습니다.
d = {}
for i, part in enumerate(s1.split('=')):
if i == 0:
metric = part
else:
d[metric], _, metric = part.partition(' ')
하지만 쉬운 방법을 알아 내고 막히는 경우 도움을 요청하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다