2013-06-18 3 views
0

를 사용하여 목록에서 비 특정 문자열을 분리 할 수 ​​있도록하려면 :이 문자열에서 'eth0를'부분을 제거 할 수 있도록하려면는 내가이 문자열이 파이썬

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 

을하지만, 항상 eth0이 아닐 수도 있습니다! "2 :"부분 이후의 위치는 일관성이 있습니다.

아이디어가 있으십니까?

편집 :

전체 아이디어는 인터페이스 이름 '보라'등, 'eth0를'... 여기에 더 이상 예제 분리하는 것입니다 :

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 
    link/ether 00:e0:c8:10:00:00 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.100.1/24 brd 192.168.100.255 scope global eth0 
    inet 192.168.200.16/32 scope global eth0 
    inet 192.168.200.17/32 scope global eth0 
    inet 192.168.200.18/32 scope global eth0 
3: gre0: <NOARP> mtu 1476 qdisc noop state DOWN 
    link/gre 0.0.0.0 brd 0.0.0.0 
4: 3g-wan1: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 3 
    link/ppp 
+0

무엇을 시도 했습니까? 이해가있는 부분을 보여주는 코드를 게시하는 것이 가장 좋으므로 사람들은 자신의 설명을 방향으로 지정할 수 있습니다. 나는 re.sub()를 조사 할 것을 제안 할 것이다. – verbsintransit

+0

'하지만 항상 eth0이 아닐 수도 있습니다! '그 밖의 무엇입니까? – Cthulhu

+0

@Cthulhu eth1, lo, eth0-0, wan1 ...은 지정된 인터페이스 이름 – user2386137

답변

1

편집 2 : 새로운 답을 업데이트 된 질문.

사용 re.findall(r'\d+: (.*?):', string)

import re 

string = """ 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 
    link/ether 00:e0:c8:10:00:00 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.100.1/24 brd 192.168.100.255 scope global eth0 
    inet 192.168.200.16/32 scope global eth0 
    inet 192.168.200.17/32 scope global eth0 
    inet 192.168.200.18/32 scope global eth0 
3: gre0: <NOARP> mtu 1476 qdisc noop state DOWN 
    link/gre 0.0.0.0 brd 0.0.0.0 
4: 3g-wan1: <POINTOPOINT,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 3 
    link/ppp 
""" 
print re.findall(r'\d+: (.*?):', string) 

출력 : 2가 고정 일부인 경우

['lo', 'eth0', 'gre0', '3g-wan1'] 
+0

이것은 틀렸다, 당신은 2를 추측 할 수 없다 : 고정 부분입니다. – zmo

+0

@zmo, 잘 원래 질문은 말했다 : "2 :"부분은 일관성이 있습니다. 지금 내 대답을 편집 할 것입니다. – Dogbert

+0

@zmo, 내 편집이 맞나요? – Dogbert

1

그것은 분명하지 않다. 당신은 그 주위에 변화를 시도 할 수 있습니다 :

import re 
re.sub("(\d*:)[^:]*:(.*)", "\\1\\2", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000") 

결과 :

'2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000' 

편집 : 우리 모두가 여러분의 기대에 길을 잘못 이해 한 것 같다. @Dogbert의 사용 findall은 내가 선호하는 옵션입니다. 그러나 클로저에 대한 re.sub 제안의 개정판을 언급 할 것입니다. 또한 적응하여 re.sub 함수 호출 위에 표시된 것을 할 수있는 :

>>> re.sub("\d*: *([^:]*):.*", "\\1", "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000") 
'eth0' 
+0

의 모든 오른쪽 parth을 원한다. 2는 고정 부분이 아니다. 예를 들어, 업데이트 된 예제에서 lo, eth0, gre0 및 3g-wan1을 분리하려고합니다. – user2386137

0

을 그 명령의 출력에 알려진 두 가지가있다 :

  • 우리는
  • 을 검사 할 인터페이스의 이름

    :
  • 형식 그래서 여기 NB: NAME: DESCRIPTION

은 정규 표현식이다3210

>>> s = "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000" 
>>> re.sub('\d+: eth0: ', '', s) 
'<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000' 

이제는 당신이 그것을 매개 변수화 할 수 있습니다

>>> iface = 'eth0' 
>>> s = "2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000" 
>>> re.sub(r'\d+: {}: '.format(iface), '', s) 
'<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000' 

그래서 당신이 그것을 기능 할 수있다 : 지금 당신이 iface 매개 변수로 lo되는 그것을 호출하는 경우

def get_iface_params(iface): 
    out = subprocess.check_output(['ip', 'addr']) 
    for s in out: 
     if 'eth0' in s: 
      return re.sub(r'\d+: {}: '.format(iface), '', s) 

을, 그것은 당신에게 줄 것이다 lo 인터페이스 매개 변수

HTH

+0

인터페이스의 이름이 항상 eth0이 아닙니다. 특정 인터페이스 이름을 다른 방식으로 사용하는 방법을 찾고 사용할 수 있습니다 이. – user2386137

+0

그런 이유로 나는 당신이'iface'라는 매개 변수 이름을 사용할 것을 제안합니다 – zmo

1

이러한 간단한 조작에는 정규 표현식이 필요하지 않습니다.

split()을 사용하십시오.

pre, x, after = s.split(': ', 2) 
s_without_x = ': '.join([pre, after]) 

결과 :

>>> x 
'eth0' 
>>> s_without_x 
'2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000' 

당신이 어떤 라인에 적용 할 경우, 당신은 if s[0].isdigit()을 확인할 수 있습니다 s을 가정하면 문자열입니다.