[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 01/23 08:36 / Filesize : 59 KB / Number-of Response : 215
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれPython(超初心者用) その21



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を開放しつつ糊付け
あとはスレッド作って回す






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<59KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef