2014-10-31 1 views
1

id를 html 태그에 추가하고 싶습니다. 예를 들어, 내가 변경하려면 :Python : 어떻게 re.sub() 대체 인수에 카운터를 추가 할 수 있습니다

<p>First paragraph</p> 
<p>Second paragraph</p> 
<p>Third paragraph</p> 

IIRC, 그것은이 기능을 달성하기 위해 람다 함수를 사용하는 것이 가능

<p id="1">First paragraph</p> 
<p id="2">Second paragraph</p> 
<p id="3">Third paragraph</p> 

에,하지만 난 정확한 구문을 기억할 수 없습니다.

+2

무엇을 시도 했습니까? –

답변

6

BeautifulSoup과 같은 HTML 구문 분석기를 사용합니다. 당신이 원하는 경우 re.sub()

x=['<p>First paragraph</p>', '<p>Second paragraph</p>', '<p>Third paragraph</p>'] 
for i, p in enumerate(x,start=1): 
...  re.sub(r'^<p>', '<p id="%d">'%i, p) 
... 
'<p id="1">First paragraph</p>' 
'<p id="2">Second paragraph</p>' 
'<p id="3">Third paragraph</p>' 
+0

답장을 보내 주시면 감사하겠습니다. –

1

:

from bs4 import BeautifulSoup 

data = """ 
<p>First paragraph</p> 
<p>Second paragraph</p> 
<p>Third paragraph</p> 
""" 

soup = BeautifulSoup(data, 'html.parser') 
for index, p in enumerate(soup.find_all('p'), start=1): 
    p['id'] = index 

print soup 

인쇄 :

아이디어는 1을 시작으로 인덱싱 enumerate()을 사용하는 모든 단락을 반복하는 것입니다 regex를 사용하면 신속하고 더러운 해결책이 될 것입니다. 과 같이, 글로벌 변수를 사용 :

i = 0 

def replace(match): 
    global i 
    i += 1 
    return '<p id="{0}">'.format(i) 

re.sub(pattern, replace, your_string) 

다른 방법으로, 즉, "척"사용자 정의 클래스를 만들 수 __call__를 사용하여 기능하고 필드로 카운터를 정의합니다 :

+0

하지만 html 태그가 포함되어 있기 때문에 @alecxe와 같이 beautifulsoup를 사용하는 것이 더 좋습니다. – nu11p01n73R

+0

어떻게 단락이 목록의 첫 번째 목록에 포함 되었습니까? – tdelaney

+0

@tdelaney 대답은 정규식을 사용하여 입력 태그에 'id'를 대체하는 방법을 보여줍니다. Op는 문서에서 모든 "p"를 변경하거나 아무 것도 언급하지 않았습니다. – nu11p01n73R

3

를 사용

<p id="1">First paragraph</p> 
<p id="2">Second paragraph</p> 
<p id="3">Third paragraph</p> 
+0

답장을 보내 주시면 감사하겠습니다. –

2

매우 일반적인 것은 아니지만 작동해야합니다.

def sub_p(string): 
    def inc(m, i=[0]): 
     i[0] += 1 
     return '<p id="%i">' % i[0] 
    return re.sub(r"<p>", inc, string) 
+0

답장을 보내 주시면 감사하겠습니다. –