[PYTHON] 파이썬에서 sscanf
PYTHON파이썬에서 sscanf
나는 파이썬에서 sscanf ()에 해당하는 것을 찾고있다. / proc / net / * 파일을 구문 분석하고 싶습니다. C에서 다음과 같이 할 수 있습니다.
int matches = sscanf(
buffer,
"%*d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %*X %*X:%*X %*X:%*X %*X %*d %*d %ld %*512s\n",
local_addr, &local_port, rem_addr, &rem_port, &inode);
처음에는 str.split을 사용하는 것으로 생각했지만 주어진 문자는 분리하지 않고 sep 문자열 전체를 분할했습니다.
>>> lines = open("/proc/net/dev").readlines()
>>> for l in lines[2:]:
>>> cols = l.split(string.whitespace + ":")
>>> print len(cols)
1
위에서 설명한대로 17 개를 반환해야합니다.
sscanf (RE가 아님)에 해당하는 파이썬이나 표준 라이브러리에있는 문자열 분할 함수 중 내가 인식하지 못하는 문자 범위를 분할하는 함수가 있습니까?
해결법
-
==============================
1.파이썬에는 sscanf가 내장되어 있지 않으며 대부분의 경우 문자열을 직접 사용하거나 regexps를 사용하거나 구문 분석 도구를 사용하여 입력을 구문 분석하는 것이 훨씬 더 합리적입니다.
파이썬에는 sscanf가 내장되어 있지 않으며 대부분의 경우 문자열을 직접 사용하거나 regexps를 사용하거나 구문 분석 도구를 사용하여 입력을 구문 분석하는 것이 훨씬 더 합리적입니다.
아마 C 언어를 번역 할 때 유용 할 것입니다. 사람들은 sscanf를 다음과 같이 구현했습니다 : http://hkn.eecs.berkeley.edu/~dyoo/python/scanf/
이 특별한 경우에는 여러 분할 문자를 기반으로 데이터를 분할하려는 경우 re.split이 실제로 올바른 도구입니다.
-
==============================
2.내가 C 분위기에 빠졌을 때 나는 보통 scanf와 비슷한 동작을 위해 zip과 list comprehension을 사용합니다. 이렇게 :
내가 C 분위기에 빠졌을 때 나는 보통 scanf와 비슷한 동작을 위해 zip과 list comprehension을 사용합니다. 이렇게 :
input = '1 3.0 false hello' (a, b, c, d) = [t(s) for t,s in zip((int,float,strtobool,str),input.split())] print (a, b, c, d)
보다 복잡한 형식 문자열의 경우 정규 표현식을 사용해야합니다.
import re input = '1:3.0 false,hello' (a, b, c, d) = [t(s) for t,s in zip((int,float,strtobool,str),re.search('^(\d+):([\d.]+) (\w+),(\w+)$',input).groups())] print (a, b, c, d)
또한 변환하려는 모든 유형에 대해 변환 함수가 필요함에 유의하십시오. 예를 들어, 위와 같은 것을 사용했습니다.
strtobool = lambda s: {'true': True, 'false': False}[s]
-
==============================
3.구문 분석 모듈도 있습니다.
구문 분석 모듈도 있습니다.
parse ()는 format () (Python 2.6 이상의 최신 문자열 서식 지정 함수)의 반대가되도록 설계되었습니다.
>>> from parse import parse >>> parse('{} fish', '1') >>> parse('{} fish', '1 fish') <Result ('1',) {}> >>> parse('{} fish', '2 fish') <Result ('2',) {}> >>> parse('{} fish', 'red fish') <Result ('red',) {}> >>> parse('{} fish', 'blue fish') <Result ('blue',) {}>
-
==============================
4.re 모듈을 사용하여 다양한 문자를 분리 할 수 있습니다.
re 모듈을 사용하여 다양한 문자를 분리 할 수 있습니다.
>>> import re >>> r = re.compile('[ \t\n\r:]+') >>> r.split("abc:def ghi") ['abc', 'def', 'ghi']
-
==============================
5.명명 된 그룹을 사용하여 모듈을 구문 분석 할 수 있습니다. 하위 문자열을 실제 데이터 유형 (예 : int)으로 구문 분석하지 않지만 문자열을 파싱 할 때 매우 편리합니다.
명명 된 그룹을 사용하여 모듈을 구문 분석 할 수 있습니다. 하위 문자열을 실제 데이터 유형 (예 : int)으로 구문 분석하지 않지만 문자열을 파싱 할 때 매우 편리합니다.
/ proc / net / tcp에있는이 샘플 라인을 보면 :
line=" 0: 00000000:0203 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 335 1 c1674320 300 0 0 0"
변수를 사용하여 sscanf 예제를 모방 한 예는 다음과 같습니다.
import re hex_digit_pattern = r"[\dA-Fa-f]" pat = r"\d+: " + \ r"(?P<local_addr>HEX+):(?P<local_port>HEX+) " + \ r"(?P<rem_addr>HEX+):(?P<rem_port>HEX+) " + \ r"HEX+ HEX+:HEX+ HEX+:HEX+ HEX+ +\d+ +\d+ " + \ r"(?P<inode>\d+)" pat = pat.replace("HEX", hex_digit_pattern) values = re.search(pat, line).groupdict() import pprint; pprint values # prints: # {'inode': '335', # 'local_addr': '00000000', # 'local_port': '0203', # 'rem_addr': '00000000', # 'rem_port': '0000'}
-
==============================
6.기본 scanf를 구현하는 ActiveState 레시피가 있습니다. http://code.activestate.com/recipes/502213-simple-scanf-implementation/
기본 scanf를 구현하는 ActiveState 레시피가 있습니다. http://code.activestate.com/recipes/502213-simple-scanf-implementation/
-
==============================
7.":"을 공백으로 변환하고 split.eg를 수행 할 수 있습니다.
":"을 공백으로 변환하고 split.eg를 수행 할 수 있습니다.
>>> f=open("/proc/net/dev") >>> for line in f: ... line=line.replace(":"," ").split() ... print len(line)
정규식 필요 없음 (이 경우)
-
==============================
8.orvoted의 답변. 나는 모듈을 다시 사용하는 것이 건전한 조언이라고 생각한다. Kodos 응용 프로그램은 Python으로 복잡한 정규식 작업에 접근 할 때 유용합니다.
orvoted의 답변. 나는 모듈을 다시 사용하는 것이 건전한 조언이라고 생각한다. Kodos 응용 프로그램은 Python으로 복잡한 정규식 작업에 접근 할 때 유용합니다.
http://kodos.sourceforge.net/home.html
-
==============================
9.업데이트 : regex 모듈에 대한 Python 문서에는 scanf 시뮬레이션에 대한 절이 포함되어 있는데 위의 응답보다 유용하다는 것을 알았습니다.
업데이트 : regex 모듈에 대한 Python 문서에는 scanf 시뮬레이션에 대한 절이 포함되어 있는데 위의 응답보다 유용하다는 것을 알았습니다.
https://docs.python.org/2/library/re.html#simulating-scanf
-
==============================
10.구분 기호가 ':'인 경우 ':'로 분리 한 다음 문자열에 x.strip ()을 사용하여 선행 공백이나 후행 공백을 제거 할 수 있습니다. int ()는 공백을 무시합니다.
구분 기호가 ':'인 경우 ':'로 분리 한 다음 문자열에 x.strip ()을 사용하여 선행 공백이나 후행 공백을 제거 할 수 있습니다. int ()는 공백을 무시합니다.
-
==============================
11.odiak의 Python 2 구현이있다.
odiak의 Python 2 구현이있다.
from https://stackoverflow.com/questions/2175080/sscanf-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 공통 요소를 공유하는 목록 병합 (0) | 2018.10.11 |
---|---|
[PYTHON] Pandas는 여러 열에 외부 데이터 프레임을 여러 개 결합했습니다. (0) | 2018.10.11 |
[PYTHON] 이상한 Try-Except-Else-Finally 동작 (Return 문 사용) [duplicate] (0) | 2018.10.11 |
[PYTHON] 프로그램 종료 전에 무엇인가하기 (0) | 2018.10.11 |
[PYTHON] "#! / usr / bin / env python"을 사용하여 파이썬에 인수를 전달할 수 없습니다. (0) | 2018.10.11 |