2009-09-04 14 views
17

jak jeśli mam ciąg jak str1 = "IWantToMasterPython"Jak wyodrębnić ciąg między 2 inne ciągi w python?

Jeśli chcę wyodrębnić "Py" z powyższego napisu. Piszę:

extractedString = foo("Master","thon") 

Chcę zrobić to wszystko, ponieważ próbuję wyodrębnić tekst ze strony html. Teksty są napisane tak jak <div class = "lyricbox"> ....lyrics goes here....</div>.

Wszelkie sugestie dotyczące sposobu wdrożenia.

Odpowiedz

30

Rozwiązaniem jest użycie wyrażenia regularnego:

import re 
r = re.compile('Master(.*?)thon') 
m = r.search(str1) 
if m: 
    lyrics = m.group(1) 
+1

Ładnie odpowiedział. Dokładnie to, co chciałem wiedzieć. Thanx –

8
def foo(s, leader, trailer): 
    end_of_leader = s.index(leader) + len(leader) 
    start_of_trailer = s.index(trailer, end_of_leader) 
    return s[end_of_leader:start_of_trailer] 

rodzi ValueError jeśli lider nie jest obecna w łańcuchu s, lub przyczepa nie jest obecna po tym (nie określono, jakie zachowanie chcesz w tak nienormalnych warunkach, zgłoszenie wyjątku jest całkiem naturalne i Pythoniczne, aby umożliwić, aby rozmówca poradził sobie z próbą/wyjątkiem, jeśli wie, co zrobić w takich przypadkach).

Możliwe jest również podejście oparte na RE, ale myślę, że to podejście czysto ciągowe jest prostsze.

2

Jeśli wyciągasz jakiekolwiek dane ze strony html, zdecydowanie sugeruję użycie biblioteki BeautifulSoup. Użyłem go również do wyodrębniania danych z html i działa świetnie.

11

BeautifulSoup to najprostszy sposób robienia tego, co chcesz. Może być instalowany jak:

sudo easy_install beautifulsoup 

przykładowy kod, aby zrobić to, co chcesz:

from BeautifulSoup import BeautifulSoup 

doc = ['<div class="lyricbox">Hey You</div>'] 
soup = BeautifulSoup(''.join(doc)) 
print soup.find('div', {'class': 'lyricbox'}).string 

Można używać Pythona urllib aby pobrać zawartość z URL bezpośrednio. Numer Beautiful Soup doc jest również przydatny, jeśli chcesz wykonać więcej analiz.

+1

Jest to zdecydowanie poprawny sposób na to, o czym mówi, że go używa. – wxs

+0

+1, To bardzo pomaga ... dzięki – mshsayem

+1

Ładnie umieścić. To był mój cel. To naprawdę pomaga. –

2

Można również spróbować jeśli chciałoby wszystkie wyjścia zdarzeń w formie listy:

import re 
str1 = "IWantToMasterPython" 

out = re.compile('Master(.*?)thon', re.DOTALL | re.IGNORECASE).findall(str1) 
if out : 
    print out 
Powiązane problemy