2017-02-17 3 views
0

正規表現を使っていないようです。美しいスープを使った正規表現 ':'の後ろにあるすべての文字を抽出

私はこのコードを実行すると、私は

for paragraph in soup.find_all('p'): 
     print(paragraph.find_all(text =re.compile(":*\w*"))) 

私が取得テキストの下にテキストだけで理想的な出力があるので、株価情報を抽出したいのは

Continuing our series of surfacing 2016 stinkers, here are the 25 Russell 2000 stocks that imploded in 2016. Further down, you'll find the 25 worst stocks excluding pharma. Ophthotech (NASDAQ:OPHT) -94% Galena Biopharma (NASDAQ:GALE) -93% Cempra (NASDAQ:CEMP) -91% Toaki Pharma (NASDAQ:TKAI) -89% Anthera Pharma (NASDAQ:ANTH) -86% Adeptus Health (NYSE:ADPT) -86% CytRx (NASDAQ:CYTR) -86% Novavax (NASDAQ:NVAX) -85%

あり得ます。

OPHT 
GALE 
CEMP 
TKAI 

など。

私はこれらのコードのバリエーションを試してみました:

for paragraph in soup.find_all('p'): 
    print(paragraph.find_all(text =re.compile('(:\w+)'))) 
for paragraph in soup.find_all('p'): 
    print(paragraph.find_all(text =re.compile("(:*\w*)"))) 
for paragraph in soup.find_all('p'): 
    print(paragraph.find_all(text =re.compile('(:)?\w+'))) 

が、私は

`['Continuing our ', 'series', " of surfacing 2016 stinkers, here are the 25 Russell 2000 stocks that imploded in 2016. Further down, you'll find the 25 worst stocks excluding pharma."] 
['Ophthotech (NASDAQ:', 'OPHT', ') -94%'] 
['Galena Biopharma (NASDAQ:', 'GALE', ') -93%'] 
['Cempra (NASDAQ:', 'CEMP', ') -91%'] 
['Toaki Pharma (NASDAQ:', 'TKAI', ') -89%'] 
['Anthera Pharma (NASDAQ:', 'ANTH', ') -86%'] 
['Adeptus Health (NYSE:', 'ADPT', ') -86%'] 
['CytRx (NASDAQ:', 'CYTR', ') -86%'] 
['Novavax (NASDAQ:', 'NVAX', ') -85%']` 

ない私が間違ってやっていることを確認の出力で終わるよ、ほとんどの時間。

ありがとうございます。

+0

好き? – serk

答えて

2

前に「」Rを追加あなたはこれを試みることができる:

あなたが見て解析しようとしている元のテキストを何
import re 

text = """Continuing our series of surfacing 2016 stinkers, here are the 25 Russell 2000 stocks that imploded in 2016. Further down, you'll find the 25 worst stocks excluding pharma. 
Ophthotech (NASDAQ:OPHT) -94% 
Galena Biopharma (NASDAQ:GALE) -93% 
Cempra (NASDAQ:CEMP) -91% 
Toaki Pharma (NASDAQ:TKAI) -89% 
Anthera Pharma (NASDAQ:ANTH) -86% 
Adeptus Health (NYSE:ADPT) -86% 
CytRx (NASDAQ:CYTR) -86% 
Novavax (NASDAQ:NVAX) -85%""" 

#Its better to compile a regex outside a loop 
pattern = re.compile(r':(\w+)\)') 

results = pattern.findall(text) 

for items in results: 
    print(items) 
+0

私はまだsoup.find_all( 'p')からテキストを取得するためにループを使用する必要がありますが、このコードは動作するようです。 'soup.find_all( 'p')の段落に対して: \t print(pattern.findall(paragraph.text))'。なぜ私は正規表現の前に 'r 'を置く必要があるのか​​まだ分かりません。ありがとうございました。 – Moondra

+0

接頭辞 'r'は「生の文字列」を意味します。それがなければ、メタキャラクターを二重に逃すべきです。たとえば、 'r" \ d + "'は '' \\ d + "' –

1

これは良い方向であるかもしれない

re.search(r':(\w+)\)', paragraph.text).group(1) 

てみパターン

+0

ありがとうございます。あなたの提案と一緒に遊んで、 'soup.find_all( 'p')の段落について思いついた: \t re.search(r ':(\ w +)\)'、paragraph.text)' 次の出力が表示されていますが(正しいと思われます)、印刷方法はわかりません。 '<_sre.SRE_Matchオブジェクト; span =(18、24)、match = ':OPHT)'> <_sre.SRE_Matchオブジェクト。 span =(24,30)、match = ':GALE)'> ' – Moondra

+0

はい、あなたは正しいです、更新されたunconfを見てください。つまり、.group(1)はあなたに希望の文字列を与えます – josifoski

関連する問題