복붙노트

[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. ==============================

    1.파이썬에는 sscanf가 내장되어 있지 않으며 대부분의 경우 문자열을 직접 사용하거나 regexps를 사용하거나 구문 분석 도구를 사용하여 입력을 구문 분석하는 것이 훨씬 더 합리적입니다.

    파이썬에는 sscanf가 내장되어 있지 않으며 대부분의 경우 문자열을 직접 사용하거나 regexps를 사용하거나 구문 분석 도구를 사용하여 입력을 구문 분석하는 것이 훨씬 더 합리적입니다.

    아마 C 언어를 번역 할 때 유용 할 것입니다. 사람들은 sscanf를 다음과 같이 구현했습니다 : http://hkn.eecs.berkeley.edu/~dyoo/python/scanf/

    이 특별한 경우에는 여러 분할 문자를 기반으로 데이터를 분할하려는 경우 re.split이 실제로 올바른 도구입니다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.re 모듈을 사용하여 다양한 문자를 분리 할 수 ​​있습니다.

    re 모듈을 사용하여 다양한 문자를 분리 할 수 ​​있습니다.

    >>> import re
    >>> r = re.compile('[ \t\n\r:]+')
    >>> r.split("abc:def  ghi")
    ['abc', 'def', 'ghi']
    
  5. ==============================

    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. ==============================

    6.기본 scanf를 구현하는 ActiveState 레시피가 있습니다. http://code.activestate.com/recipes/502213-simple-scanf-implementation/

    기본 scanf를 구현하는 ActiveState 레시피가 있습니다. http://code.activestate.com/recipes/502213-simple-scanf-implementation/

  7. ==============================

    7.":"을 공백으로 변환하고 split.eg를 수행 할 수 있습니다.

    ":"을 공백으로 변환하고 split.eg를 수행 할 수 있습니다.

    >>> f=open("/proc/net/dev")
    >>> for line in f:
    ...     line=line.replace(":"," ").split()
    ...     print len(line)
    

    정규식 필요 없음 (이 경우)

  8. ==============================

    8.orvoted의 답변. 나는 모듈을 다시 사용하는 것이 건전한 조언이라고 생각한다. Kodos 응용 프로그램은 Python으로 복잡한 정규식 작업에 접근 할 때 유용합니다.

    orvoted의 답변. 나는 모듈을 다시 사용하는 것이 건전한 조언이라고 생각한다. Kodos 응용 프로그램은 Python으로 복잡한 정규식 작업에 접근 할 때 유용합니다.

    http://kodos.sourceforge.net/home.html

  9. ==============================

    9.업데이트 : regex 모듈에 대한 Python 문서에는 scanf 시뮬레이션에 대한 절이 포함되어 있는데 위의 응답보다 유용하다는 것을 알았습니다.

    업데이트 : regex 모듈에 대한 Python 문서에는 scanf 시뮬레이션에 대한 절이 포함되어 있는데 위의 응답보다 유용하다는 것을 알았습니다.

    https://docs.python.org/2/library/re.html#simulating-scanf

  10. ==============================

    10.구분 기호가 ':'인 경우 ':'로 분리 한 다음 문자열에 x.strip ()을 사용하여 선행 공백이나 후행 공백을 제거 할 수 있습니다. int ()는 공백을 무시합니다.

    구분 기호가 ':'인 경우 ':'로 분리 한 다음 문자열에 x.strip ()을 사용하여 선행 공백이나 후행 공백을 제거 할 수 있습니다. int ()는 공백을 무시합니다.

  11. ==============================

    11.odiak의 Python 2 구현이있다.

    odiak의 Python 2 구현이있다.

  12. from https://stackoverflow.com/questions/2175080/sscanf-in-python by cc-by-sa and MIT license