2016-03-29 10 views
-1

なぜこの正規表現が一致しないのかについてのヘルプは<td>\nなどですか?私はpythex.orgでうまくテストしました。基本的には、私はちょうどmyfile.docと言うので、出力をクリーンアップしようとしています。また、私はそれがrepr(filename)を見ずに言うのは難しいですが、私はあなたの問題はエスケープ改行文字と実際の改行文字の混乱だと思う(<td>)?\\n\s+(</td>)?re.subは一致していないと思われます。

>>> from bs4 import BeautifulSoup 
>>> from pprint import pprint 
>>> import re 
>>> soup = BeautifulSoup(open("/home/user/message_tracking.html"), "html.parser") 
>>> 
>>> filename = str(soup.findAll("td", text=re.compile(r"\.[a-z]{3,}"))) 
>>> print filename 
[<td>\n     myfile.doc\n    </td>] 
>>> duh = re.sub("(<td>)?\n\s+(</td>)?", '', filename) 
>>> print duh 
[<td>\n     myfile.doc\n    </td>] 
+0

? –

+0

は投稿を更新します。 sec – dobbs

+0

'BeautifulSoup'を含まないようにこれを単純化できますか?文字列リテラルに 'filename'を代入するだけで、簡単にコードを実行して何が起こるかを見ることができます。 – ArtOfWarfare

答えて

3

を試してみました。

比較し、以下の例を対比:

>>> pattern = "(<td>)?\n\s+(</td>)?" 
>>> filename1 = '[<td>\n     myfile.doc\n    </td>]' 
>>> filename2 = r'[<td>\n     myfile.doc\n    </td>]' 
>>> 
>>> re.sub(pattern, '', filename1) 
'[myfile.doc]' 
>>> re.sub(pattern, '', filename2) 
'[<td>\\n     myfile.doc\\n    </td>]' 
+0

はrepr()について知らなかった。非常に便利! >>> repr(ファイル名) "'[​​\\\\ n filename.doc \\\\ n]'" ありがとうございます! – dobbs

0

あなたの目標はただ<td>タグ内から取り除いた文字列を取得する場合、あなただけのBeautifulSoupは、タグのstripped_strings属性を取得することにより、あなたのためにそれをやらせることができます:あなたは、同じ種類のタグからさらに文字列を抽出したい場合は

from bs4 import BeautifulSoup 
soup = BeautifulSoup(open("/home/user/message_tracking.html"),"html.parser") 
filename_tag = soup.find("td", text=re.compile(r"\.[a-z]{3,}"))) #finds the first td string in the html with specified text 
filename_string = filename_tag.stripped_strings 
print filename_string 

あなたは、現在の1の後の次のTDタグを抽出するためにfindNextを使用することができます。

filename_tag = soup.findNext("td", text=re.compile(r"\.[a-z]{3,}"))) #finds the next td string in the html with specified text after current one 
filename_string = filename_tag.stripped_strings 
print filename_string 

そしてループを通る...あなたに合うようにしようとしている何

関連する問題