1 名前:デフォルトの名無しさん [2014/01/02(木) 12:52:08.79 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。 エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。 騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。 次スレは >>985 辺りで 前スレ くだすれPython(超初心者用) その20 toro.2ch.net/test/read.cgi/tech/1387082467/ 関連スレ Pythonのお勉強 Part49 toro.2ch.net/test/read.cgi/tech/1387528488/ ◆関連リンク Python の Home Page ttp://www.python.org/ ◆長いコードはこういうところにはってください ttp://ideone.com/ ttp://codepad.org/ ttp://pastebin.com/ dpaste.com/ ◆まとめwiki ttp://python.rdy.jp/
165 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 18:00:57.86 ] Pythonの正規表現は引数の順番が他の言語と違ってて時々間違えるけど ワケ分からなくはないだろ
166 名前:デフォルトの名無しさん [2014/01/20(月) 18:15:45.70 ] いや、俺の持ってるPythonの本とか全然詳しく書いてないから、 後方一致だとか、大文字小文字の無視とか訳が分からんかった PHPのpreg_matchみたいな簡単なのあればいいのに 文法が気に喰わん re.compile()した後にsearch()してgroup()して...とか めんどくさい
167 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 18:17:25.84 ] >>163 パーサを作って、タグや属性等はイベント・ドリブンで処理してる。
168 名前:デフォルトの名無しさん [2014/01/20(月) 18:19:12.38 ] >>163 mechanizeってライブラリで簡単にできる例えば <div>あ</div> ← こういう文字列から"あ"だけを取り出すのとか 自分で正規表現かく必要すらない でもPythonからmechanizeを扱うには日本語資料少なすぎて難しいかもしれない rubyからmechanizeを扱うなら資料沢山あるのだけど
169 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 18:21:09.90 ] >>166 正規表現よく使うなら正規表現リテラルのある Ruby のほうが向いてるかも あと Python は re.compile() するのが面倒なら re.search() とかモジュールメソッド呼んでも構わない
170 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 20:05:04.04 ] Pythonのreモジュールでデリミタ変更したいんだけど、どうすればいい? シングルクォート、ダブルクォート以外にしたいんだけど 例えば、 pattern = r"正規表現" r = re.compile(pattern) m = r.search(str) が一般的だと思う
171 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 20:27:29.51 ] r"..." は raw 文字列って言って文字列の一種 r"\n" は バックスラッシュと n の二文字に解釈される 正規表現のデリミタではないよ
172 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 20:42:39.09 ] r"\"" がめんどいから r|"| みたいに書けないかって話だと思う perlやrubyの悪臭がするけど
173 名前:デフォルトの名無しさん mailto:sare [2014/01/20(月) 20:54:00.40 ] 三連クオートのRAW文字列使えばいいだろ pattern = r"""aaa"bbb""" 日本語ドキュメントあるんだし読めよ
174 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 20:57:02.69 ] PHP じゃないかなあと
175 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 21:52:12.29 ] >>172 そう、そういうこと 説明の仕方が悪かったね、ごめん
176 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 23:49:20.74 ] その文字列に、 〇〇以外の文字列が含まれているかどうかってのはどうやって判断すればいいの? 俺が馬鹿なのか全く思いつかない
177 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 23:58:23.09 ] 〇〇の文字列を置換で除去した後に、何か残ってるか調べるのはどう
178 名前:デフォルトの名無しさん mailto:sage [2014/01/20(月) 23:59:47.69 ] 頭がいいと難しく考えすぎることがある。 アホは、○○を検索して見つからなかったら含まれていないと考えるw
179 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 00:31:58.54 ] 単語単位なのか文字単位なのか、 重複する文字を許すかどうかで変わってくると思う。 "lolol".replace("lol", "") # 'ol' re.sub(r"lol", "lolol", "") # '' not re.match(r"^(AAA|BBB|CCC)+$", "CCCBBBAAAd") # True
180 名前:179 mailto:sage [2014/01/21(火) 00:33:53.50 ] ごめん、re.subの引数の順番間違えた re.sub(r"lol", "", "lolol") # '' でした
181 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 11:16:29.47 ] Pythonの正規表現を本やWeb上で調べると、だいたい e = re.compile(pattern) r = e.search(str) if r is None: print("fuck you") else: i = 0 while i >= -: m = e.search(str, i) if m: print m.group(1) i = m.start() +1 と書いてる(後半は自分のやり方)
182 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 11:20:45.13 ] でも、あるサイトで r = re.search(pattern, str, flags) と書いてたんだけど、これでいけるの? 実際実行してみて上手くいったような気がするんだけど、 compileしなくてもいいのなら、連続で正規表現適用させる場合なんか、わざわざ冗長な上の書き方しなくて済むから楽だよね? この下のやり方で問題のある時、デメリットってあるの?
183 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 11:44:47.68 ] >>180 >>> re.sub(r"lol", "", "lolol") 'ol'
184 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 12:51:19.13 ] >>182 コンパイル済み正規表現オブジェクトは、Python2では100個、Python3では512個キャッシュされるので re.search使ったとしても、毎回コンパイルされるわけではない 詳しくは /Lib/re.py のソースコード参照 ループ中で同じ正規表現を何百万回も使う場合など・・・ キャッシュから取り出す処理時間すらも削りたい状況ではcompileを使うべき 速度を気にしないなら可読性の良いre.searchでおk ただしre.searchには、検索範囲を指定する引数はない
185 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 13:45:16.38 ] ディクショナリの順番って何順になるの?
186 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 14:04:58.84 ] >>185 Pythonの実装依存 順番をそろえたいなら for k in sorted(dic.keys())
187 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 14:08:33.01 ] >>184 なるほど 教えてくれてありがと
188 名前:デフォルトの名無しさん [2014/01/21(火) 15:26:29.05 ] py2.7 beautifulsoupでパースできなかった場合、 lに値が入らず下記エラーになります。 if (l == None): といった風に例外処理を書く事は出来るんでしょうか? エラーで処理を止めずに、エラーが出た事を取得したいのですが・・ 分かる方いらっしゃいましたら、お願い致します! f = open("test.html") s = BeautifulSoup(f) l = s.find("a")["href"] TypeError: 'NoneType' object has no attribute '__getitem__'
189 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 16:14:20.71 ] ごめん、また質問させて欲しいんだけど... 正規表現使用して、該当部分を表示するのではなく、 逆に削除して、その部分を抜いて表示したい場合どうすればいい? >>181 で言えば、m.start()やm.end()で該当部分が出てくるけど(例えば123-184)、 その部分を抜いて表示するというやり方しかないのかな?
190 名前:181 mailto:sage [2014/01/21(火) 16:30:30.41 ] 訂正しとく i = m.start()+1じゃダメだね i = m.end()+1じゃないと じゃないと重複が大量に出てきてしまうし、処理速度が極めて遅くなってきそう
191 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 16:44:36.99 ] >>189 置換したいのかな? s = "ab2c45d67e8fg" print(re.sub(r'\d+', '', s))
192 名前:181 mailto:sage [2014/01/21(火) 16:49:41.71 ] >>191 あ、そうか 俺バカだなぁ str = str[0:m.start()-1] + str[result.end()+1:] とかめんどくさいことしてた ま、これでも出来ることは出来るんだけどね どっちが処理速度が早いかは分からんけど なんかPython触ってから他の言語で出来ることを複雑に考えすぎてるのか、混乱してるっぽい とりあえず教えてくれてありがと
193 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 17:09:45.45 ] >>188 たぶんfindで見つからないときNoneが返るんでしょ? a = s.find("a") if a is None: print 'エラーです' else: l = a["href"]
194 名前:デフォルトの名無しさん mailto:sage [2014/01/21(火) 21:06:23.68 ] >>193 あー思い通りにいきました。ありがとうございます。
195 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 02:17:05.01 ] >>183 指摘thx 今度からtypoなくす為に、コピペにします >>185 順序付辞書なら、collections モジュールに OrderedDict もあるよ。こちらは挿入順。
196 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 17:49:26.29 ] HELPです 関数内でループが適用されません 以下のスクリプトを行うと、urlやjavascriptがそれぞれ一つずつしか抽出されません インデントも確認してみたんですが... うpローダーにスクリプトをあげました www.dotup.org/uploda/www.dotup.org4819644.py.html 関数にせずに、それぞれ素で適用させた場合は上手くいくのですが、 そのそれぞれの処理を関数に書いて適用させた際には、結果が一つしか出てきません スコープなのかなぁ? Pythonは良く分かりません
197 名前: 忍法帖【Lv=3,xxxP】(2+0:5) [2014/01/22(水) 17:58:01.18 ] 直リン貼れなかったので、ちょっと自分の忍法帖確認してみます すみません
198 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 18:28:22.22 ] >>196-197 再現可能なサンプルデータぐらい用意したら? URLじゃなくてそのまま食わせられるHTMLね あと、ソース貼るならpastebin.com、codepad.org、ideone.comとかにしてくれ
199 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 18:31:28.15 ] >>196 チラっと見た感じだけど、正規表現パターンが原因でしょ 最初の pattern_url はいいが、残り2つは前後に .+ .* が付いてるから 1回で文字列全体にマッチして終了してしまうよ
200 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 18:33:26.13 ] 他の言語ができるならテストを書きなされ
201 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 18:43:02.73 ] 変に複雑な事してるけど、こんな感じでいいと思うけどなあ results = [] for m in re.finditer(r'''\bhref=['"]?([^"<>\s]+)''', html, flags = re.I): results.append(m.group(1)) if uniq: results = list(set(results))
202 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 20:57:54.65 ] >>196 tagRemoveのre.subを繰り返し呼ぶようなコードだけど、 一度で全て置換されるのでループは不要。 re.subn使えば置換個数を確認できます。
203 名前:デフォルトの名無しさん mailto:sage [2014/01/22(水) 21:47:35.69 ] >>196 です 皆さん、色々とアドバイスありがとうございました
204 名前:デフォルトの名無しさん [2014/01/23(木) 00:17:18.66 ] 直リンク禁止されてるのでscheme部を省いてリンクします コード : pastebin.com/7YqtR23Q 空白行が除去できないのですが、これは自分の正規表現の書き方が悪いからでしょうか? それとも、pythonのコーディングが間違っているからでしょうか? 自分の結果では最初の20行は空白行が続き、21行目に" / "と言う文字が出てきます その後はまた暫く空白行が続きます これらの空白行を全部取り除きたいのですが... もしかしたらこのような面倒くさいやり方ではなく、関数などの利用で一気に除去できるかもしれませんが 検索しても見当たりませんでした アドバイス頂けないでしょうか?
205 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 00:36:54.08 ] Pythonの実行速度、たとえばfor文で何百万回も ループを回すような処理が遅くて困っています。 リスト内包表記とかmap関数とかjoin関数とかで 極力高速化しているものの、Pure Pythonでは 頭打ちの状態です。 CPythonやCython、PyPyなど、実装側で高速化する 方法を検討していますが、これといった決め手に 欠けています。 主な用途はNumPyを併用した科学計算や データの整形など、数値計算寄りです。 サーバアプリのような規模の大きいものではなく、 単一のスクリプトファイルを必要な時に叩くといった やり方がほとんどです。 sys、os、subprocess、numpyは必須。 できればscipyやmultiprocessingも使いたいです。 Mac/Win/Linuxいずれの環境でも実行できる必要が あります。 そして互換性や可読性の都合上、各実装に特化した コーディングは極力避けたいです。 各実装の得手不得手など、ざっくりとした内容で 結構ですのでご意見いただけませんでしょうか?
206 名前:デフォルトの名無しさん [2014/01/23(木) 01:14:19.47 ] そこまでやるなら素直にRubyへ移行したほうが良いです。 そのままゴリ押ししても良いことないです。
207 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 01:16:49.69 ] >>204 正規表現を勉強する 検索ではなく公式のチュートリアルと標準ライブラリにざっと目を通す 2 タブをやめる
208 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 01:51:16.12 ] >>205 cで書け
209 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 02:17:47.09 ] >>205 Cythonで十分だろう なにが不満なんだ
210 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 02:39:36.29 ] >>205 つanaconda accelerate
211 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 03:12:36.80 ] >>205 PyPyは確かにCPythonより計算とか速いこともあるけど一長一短でそれだけな感が Cythonは型指定でC/C++に迫れるけどそもそもCに変換してコンパイルしてるので C/C++で書いたらいいじゃない感、PurePythonコーディングでなければ互換性がないのも… numpy前提なら小手先のマルチプロセスより pyopenclでも使ったほうが次元の違うレベルになるんじゃないかな
212 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 04:28:10.51 ] >>204 ここで質問したのはもう終わりにするの? Regular Expression(正規表現) Part12 toro.2ch.net/test/read.cgi/tech/1387257592/234
213 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 06:54:13.07 ] >>204 空白行を取り除く print("\n".join(x for x in html.splitlines() if x))
214 名前:デフォルトの名無しさん mailto:sage [2014/01/23(木) 06:56:06.28 ] PyPyは注意書きにあるようにPurePythonじゃないとエミュレーションで遅くなるし 俺は速度が必要な時はCython/Cだね Cで書いてCythonでGILを開放しつつ糊付け あとはスレッド作って回す