Pythonで改行を除去し、会社名を変更する方法と正規表現で数字を抜き出す方法

このQ&Aのポイント
  • Pythonのプログラムを使用して、改行を除去して会社名を変更する方法について教えてください。
  • また、Pythonの正規表現を使用して、テキストから数字を抜き出す方法についても教えてください。
  • 説明された方法を使用することで、改行を除去し、会社名を変更することができます。また、正規表現を使用することで、テキストから数字を抜き出すこともできます。
回答を見る
  • ベストアンサー

python

for company in lines: company2= company +"(株)" print company2 この書き方だと エイブル (株) テーオーシー (株) のように改行が入ってしまいます。 これを エイブル(株) テーオーシー(株) としたいのですがどうすればいいでしょうか。 ちなみにcompanyには会社の名前が次々に入っていきます。 また Yahoo!・ユ・。・、・ハ・鵐ケ - 8872.q Yahoo!・ユ・。・、・ハ・鵐ケ - 6758.t から数字の8872や6758を正規表現で抜き出したいのですがどうやって書けばよろしいでしょうか。

  • Python
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

Pythonは2.x系しかやってないので、3.x系だと少し違うかもしれません。 質問の場合、companyの文字列の最後に改行が含まれているのでしょう。 > company2= company +"(株)" の部分を < company2= company.rstrip() +"(株)" とすれば、company行末の空白文字(改行を含む)が除去されますので、改行されなくなると思います。 # 行頭の>や<は引用記号です。実際のプログラムには入れないでください 正規表現の方ですが import re r=re.compile(".*- (\d+)\..") としておいて x = r.match("Yahoo!・ユ・。・、・ハ・鵐ケ - 8872.q") とすると x.group(1)で文字列'8872'が取れます。 整数で取りたければint(x.group(1))としてください。

dfadsfadad
質問者

お礼

ありがとうございます。問題解決いたしました。 後1つ質問よろしいでしょうか。 Yahoo!・ユ・。・、・ハ・鵐ケ - 8801.t Yahoo!・ユ・。・、・ハ・鵐ケ - 8928.o Yahoo!・ユ・。・、・ハ・鵐ケ - 8999.t Yahoo!・ユ・。・、・ハ・鵐ケ - 3235.f のような文字列が現れた場合とそれ以外の文字列が現れた場合で処理を分岐させたいのですが、この場合 if… else と書きたいのですが…の部分はどう書けばよろしいでしょうか。 ・ユ・。・、・ハ・鵐ケ - の部分は半角です。

その他の回答 (3)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

解釈するのがHTMLなら、正規表現で処理するよりhtmllib等のHTML解析器を使った方が後々修正などし易いと思う。 まあ、最初はちょっと勉強しないといけないでしょうけど。

dfadsfadad
質問者

お礼

ありがとうございます。 ちょっと勉強しなおしてきます。 丁寧な解説をありがとうございました。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

ANo.2へのお礼について。 まず、ここの表示では行頭空白が削除されるので、全角空白でも使って書かないとPythonコードは読めないよ。 閑話休題。 行ごとに処理しているコードの中で次の行を読むのは正しく動作できないので止めた方が良い。フラグを立てておいて、繰り返しの初めにフラグチェックして書き出すとか、そういう方法で対応できそうだけど。

dfadsfadad
質問者

お礼

いろいろとありがとうございました。 ちょっと自分で十分に考えて見ます。 丁寧に解説をしてくださり誠にありがとうございました。

dfadsfadad
質問者

補足

ちょっと良くわからない質問ですみませんでした。 pythonの練習として http://charge.biz.yahoo.co.jp/report/sector33/brand_report/2730.html というサイトの <td align="center" bgcolor="#ffffee"><small>2009ヌッ3キ・/small></td> <td align="right"><small>803,004</small></td> <td align="right"><small>1,232</small></td> <td align="right"><small>11,751</small></td> <td align="right"><small>-13,506</small></td> </tr><tr bgcolor="#ffffff"> <td align="center" bgcolor="#ffffee"><small>2008ヌッ3キ・/small></td> <td align="right"><small>851,205</small></td> <td align="right"><small>8,480</small></td> <td align="right"><small>21,227</small></td> <td align="right"><small>6,754</small></td> の数値(803,004等)を年代別に抜き出したいのですが d = urllib.urlopen("http://charge.biz.yahoo.co.jp/report/sector33/brand_report/2730.html") txt=d.read() lines2 = txt.split("\n") としたのですがこの続きがイマイチわからないのですがどうしたら効率よく抜き出せますか?

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ANo.1へのお礼に書かれた質問について。 「のような」「それ以外」というのがどんな文字列を想定しているのか分からないのでif条件が書けません。

dfadsfadad
質問者

お礼

少し整理したので見てもらえないでしょうか for line2 in lines2: if "あいうえお" in line2: frag=1 if frag==1: if "かきくけこ":             (…) ここの(…)の部分に現在読み込んでいる行の次の行からprint文で書きだしたいのですが次の行というのはどうやって書けばよろしいでしょうか。

関連するQ&A

  • [python] 関数から配列を戻すには?

    グローバル変数(配列)の値を変えたいと思います。 ------------- line = [] def tmp_read(self, *out_line): f = open('tmp.txt') lines2 = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる) f.close() # lines2: リスト。要素は1行の文字列データ for line in lines2: print line, print *out_line = lines2 return *out_line tmp_read(self, *line) print line     ← 配列Lineの内容を確認する ------------- この「line」には、文字列を含む配列を入れる予定です。 lines2で得られた値を、戻せば出来そうな気もしますが巧くいきません。 どのように修正すれば酔いか、教えて頂けませんか。

  • pythonで制作中のプログラムのエラー修繕と速度向上を行いたいのですが...

    こんにちは。いつもお世話になっております。 今回、file("filename.txt", "r")で読み込んだ多次元配列の中から、数字の合計が一番大きくなる長方形を探し出して合計をprintするプログラムを作っています。なんだか分かりにくい説明ですみません...。 例えば、 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 が読み込まれた配列だとしたら、左下の 9 2 -4 1 -1 8 を含む長方形内の数字の合計(9+2-4+1-1+8)が、この配列内の数字の合計の最大になります。この最大合計値を含む長方形を見つけ出して合計をprintさせたいのです。 自力で書いたものは以下です↓ myFile = file("matrix.txt", "r") row = 0 for line in myFile: line = line.rstrip() nums = line,split(" ") dim = len(nums) for col in range(dim): matrix[row][col] = int(nums(col))←ここでエラーが出てしまいました   row = row+1 myFile.close() sumMatrix = [[0 for j in range(dim)] for i in range(dim)] for m in range(dim): for n in range(dim): mySum = 0 for p in range(m+1): for q in range(n+1): mySum = mySum = matrix[p][q] sumMatrix[m][n] = mySum for i in range(dim): for j in range(dim): print sumMatrix[i][j], 8行目のエラーを解消させたいのと、このプログラムで配列が大きいものになると、とても遅くなってしまうようなので、もっと早いものにしたいのですが... ご回答、よろしくお願いします。

  • エラーの原因が分からず困ってます。

    下記のmatchのところで、エラー(TypeError: expected string or bytes-like object)が出て原因が分からず困ってます。 'ファイルをオープン' with open(target_file) as f: lines = f.readlines() '改行を削除' lines_strip = [line.strip() for line in lines] print(lines_strip)  keyword = input()  match = re.findall(keyword,lines_strip)

  • python超初心者です(3時間目)。pythonで以下のようなランダ

    python超初心者です(3時間目)。pythonで以下のようなランダム数列を生成させるにはどうしたらいいのでしょうか? 最終結果のイメージ(16進数8桁の数列x20行): 0 : c39a29eb 1 : b26cc9bb 2 : 4c494e47 ... 19: 93c85836 以下のようにコードを組んでみたのですが、 > tmp = ws.join(list) > TypeError: sequence item 0: expected string, int found のようなエラーが出てしまいます。どうやら数字を連結しようとしてるのでダメなのかな?と思っています。 ======================================== #! /usr/bin/python import random list = [] ws = "" for i in range (20): print i, ":", for j in range(8): list.append(random.randint(0,15)) tmp = ws.join(list) print tmp list = [] tmp = "" ======================================== ※ printでは必ずスペースが入ってしまうので、それを嫌う場合配列に入れて、要素を連結させなくてはならない、とwebにあったので、その方向で試してみました。 ※ また、ここではあくまでrandom を使用し、一文字(0,1,2,...E,F)づつ出力させたいと思っています。 なお、perlでは以下のように書くことができたのですが... ======================================== #! /usr/bin/perl for($i=0; $i<20; $i++){ printf ("%-02s: ", $i); for($j=0; $j<8; $j++){ printf("%x", int(rand(15)) ); } print "\n"; } ======================================== ※ んー第二言語としてpythonを学習してみていますが道のり険しそうです(やっぱrubyにしようか)... 宜しくお願い致します。

  • Perlでテキストファイルの処理方法

    Perlでファイル入力は 下記のように記述します open (IN,"myInput.txt"); $lineno = -1; while (<IN>) {  $lineno = $lineno + 1;  @lines_org[$lineno] = $_;  #print lines_org[$lineno];  #print $_,"\n";  } これで一行づつ入力できます ここで質問したいのは 入力ファイルに改行コードがないため 処理できないと思うのですが 一行づつ入力ではなく、1文字づつ入力する 入力方法はPerlにはないのでしょうか ちなみに入力ファイルは数メガある大きなファイル です よろしくおねがいします

    • ベストアンサー
    • Perl
  • Pythonで重複無しの出題をしたい。

    Pytonで初歩的なcodeを書いております。 十個の四文字熟語があります。 重複のない四文字熟語を表示したいのです。 (1)のcodeでは上手く行くのですが、(2)の様にテキストファイルから読み込むと重複します。 多分while関数を使って重複が有ったら、再度randomで重複しないデータを抽出しろとでもやるのでしょうが、上手く行きません。 while以降どの様にcodingするのか、或いはそのほかの方法を教えて頂ければ嬉しいです。 宜しくお願い致します。 (1) リストから重複無しの熟語を表示する---OK ---------------------------- import random 四文字熟語=[ '0 百花繚乱', '1 疾風迅雷', '2 明鏡止水', '3 不撓不屈', '4 国士無双', '5 魑魅魍魎', '6 行雲流水', '7 花鳥風月', '8 天下無双', '9 行雲流水' ] 空リスト = [] for カウンター in range(10): 一時保存 = random.choice(四文字熟語) while 一時保存 in 空リスト: 一時保存 = random.choice(四文字熟語) 空リスト.append(一時保存) print(一時保存) これは重複無しの熟語を表示します。 --------------------- (1) テキストファイルから、重複無しの熟語を表示する---NG import random file = open("四文字熟語.txt") lines = file.readlines() file.close() for line in lines: line = line.rstrip("\n") temp = random.choice(lines) print(temp) Shellには、 7 花鳥風月 6 行雲流水 6 行雲流水 7 花鳥風月 2 明鏡止水 9 行雲流水 9 行雲流水 8 天下無双 7 花鳥風月 0 百花繚乱 -------------------------- このほうほうだと、こんな風に表示されます。

  • レコードの書込み判断

    ファイルを読込み、読込まれたレコードの39桁目が0であれば出力という判断を下記のコーディングに追加したいのですが、どのように記述すればよいでしょうか? if(open(OUT,">$year$mon$mday$csv")){  for my $fname (sort @dirs){   if(open(IN,"$fname")){   my @lines = <IN>;   print OUT @lines;   close(IN);   }  }  close(OUT); }

  • 正規表現でURLだけを取り出したい

    正規表現でURLだけを取り出したいのですが、うまくできなくて困っています。 あああああ http://www.yahoo.co.jp abcdefg if ($_=~/(.*)http(.*)[  \n](.*)/){ print $2 } とやると http://www.yahoo.co.jp abcdefg となってしまいます。 http://www.yahoo.co.jp だけを取りたいのですが・・・ []のなかは 半角スペース、全角スペース、改行 です。

    • ベストアンサー
    • Perl
  • Pythonプログラミングでエラー

    Pythonのプログラムを教科書をみながら勉強しはじめました。 バージョンは3.0.1です。 下記の初歩的なプログラムで#の行でエラーがでて対応方法が わかりません。 アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis ''' 簡単な電卓です。 Usage: mycalc.py n (+-*/) m ''' import sys, operator OP={'+':operator.__add__,\ '-':operator.__sub__,\ '*':operator.__mul__,\ '/':operator.__truediv__,\ } def calc(ls): assert len(ls)==3 #ここでエラー try: op=OP(ls.pop(1)) # 真ん中の文字列をpop,数字のみ残る。 x,y=[float(u) for u in ls] # 残った文字列をfloatに変換 except: print('Err:数字 演算子(+-*/) 数字 の順に引数をセットしてください。') sys.exit() return op(x,y) if __name__=='__main__': print(calc(sys.argv[1:])) #ここでエラー (ここで質問するとTABのインデントがなくなってしまうようです。)

  • pythonのコードで原因不明のエラーが出ます。

    シーケンス型データに何かの値を掛けるよう命令した覚えはないのですが、can't multiply sequence by non-int of type 'float' というエラーが出ます。 以下は当該のコードです。 リストqueriesの中にある英文からランダムに値を出し、手で入力した回答in_ansの正誤に応じて次に出題する確率を制御するコードです。 import numpy as np import random true_ans=["those foods enable us to get nutrition even in developing countries", "there are vast numbers of starving children or breadwinners"] queries=["those foods enable us to get nutrition even [mask] developing countries", "there are vast numb[mask] of starving child[mask] or breadwinn[mask]"] for i in range(2): w=[] w=np.ones_like(true_ans) a_Q=random.choices(queries,k=1,weights=w) print(a_Q) idx=queries.index(a_Q) in_ans = input("input answear") if in_ans == true_ans[idx]: w[idx] -= 1 print(t) else: w[idx] += 2 print(f)