質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

137閲覧

文字列と数字が一つの単語で同時に含まれた要素を内包するリストの文字の置き換え

gran-1123

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/30 07:20

前提・実現したいこと

現在、HTMLデータから抽出したテキストの表記揺れを排除し、「宇宙世紀」の部分を「U.C.」という表記に統一したリストを出力できるようにすることを目的としたプログラムを作成しており、例としてリスト内の「宇宙世紀0079」を「U.C.0079」に表記を統一したい、といった感じです。

発生している問題・エラーメッセージ

しかし、数字と文字列が同時に含まれるリスト内部の、一部分だけを置き換えを行なう方法がわからず苦戦しています。

該当のソースコード

python3系

1#coding:utf-8 2import re 3from bs4 import BeautifulSoup 4import pandas as pd 5 6results_hi = []#年号を格納しておく関数 7 8absobe_pattern_history = 'U.C.[0-9]{4}|宇宙世紀[0-9]{4}'#宇宙世紀の年号 9 10# encoding は取得したページの文字コードを選択 11filepath = '/home/urai/crawling/gandamu/gandamu uchuuseiki/26.html' 12with open(filepath , encoding='utf-8') as f: 13 html = f.readlines() 14 for i in html: 15 soup = BeautifulSoup(i, 'html.parser')#SoupでHTMLからデータを取る 16 for text in soup.find_all(text=True):#Tabを取り除く 17 if text.strip():#テキストであるか判定 18 #print(text) 19 results_hi.append(re.findall(absobe_pattern_history, text))#条件に適合した文(年号)を抽出、results_hiに格納 20 f.close() 21 22 UC_history = [hi[0] for hi in results_hi if hi != []]#抽出データから空のリストを取り除いた上で、入れ子構造を解消 23 24 UCH = ",".join(UC_history) 25 UC_history2 = UCH.replace('宇宙世紀[0-9]{4}', 'U.C.[0-9]{4}')#"宇宙世紀"の部分を"U.C."に置き換え 26 UCH2 = UC_history2.split(",") 27 28 his_list = sorted(set(UCH2), key=UCH2.index)#リスト内部の重複を排除 29 30 his_list.sort()#年代順に並び替える 31 32 print(his_list) 33
出力 ['U.C.0001', 'U.C.0058', 'U.C.0063', 'U.C.0071', 'U.C.0079', 'U.C.0080', 'U.C.0081', 'U.C.0082', 'U.C.0083', 'U.C.0084', 'U.C.0085', 'U.C.0087', 'U.C.0088', 'U.C.0089', 'U.C.0090', 'U.C.0091', 'U.C.0092', 'U.C.0093', 'U.C.0094', 'U.C.0095', 'U.C.0096', 'U.C.0097', 'U.C.0099', 'U.C.0100', 'U.C.0104', 'U.C.0105', 'U.C.0106', 'U.C.0107', 'U.C.0120', 'U.C.0122', 'U.C.0123', 'U.C.0133', 'U.C.0136', 'U.C.0140', 'U.C.0143', 'U.C.0149', 'U.C.0153', 'U.C.0168', 'U.C.0169', 'U.C.0203', 'U.C.0218', 'U.C.0223', 'U.C.0653', 'U.C.1000', '宇宙世紀0001', '宇宙世紀0058', '宇宙世紀0068', '宇宙世紀0079', '宇宙世紀0080', '宇宙世紀0083', '宇宙世紀0087', '宇宙世紀0088', '宇宙世紀0093', '宇宙世紀0096', '宇宙世紀0097', '宇宙世紀0100', '宇宙世紀0103', '宇宙世紀0104', '宇宙世紀0105', '宇宙世紀0120', '宇宙世紀0121', '宇宙世紀0122', '宇宙世紀0123', '宇宙世紀0133', '宇宙世紀0136', '宇宙世紀0140', '宇宙世紀0149', '宇宙世紀0153', '宇宙世紀0203', '宇宙世紀0218', '宇宙世紀0223']

試したこと

上記ソースコードの以下の部分でテキスト置き換えを試みましたができませんでした。

UCH = ",".join(UC_history) UC_history2 = UCH.replace('宇宙世紀[0-9]{4}', 'U.C.[0-9]{4}')#"宇宙世紀"の部分を"U.C."に置き換え UCH2 = UC_history2.split(",")

補足情報(FW/ツールのバージョンなど)

pythonのバージョンは3.6.5です。
入力である'/home/urai/crawling/gandamu/gandamu uchuuseiki/26.html'はガンダムに関係する複数のWebページから抽出したHTMLデータを一つにまとめたものです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

正規表現re.subで置換できます。
参考:Pythonの正規表現モジュールreの関数match、search、sub

Python

1import re 2s = '宇宙世紀0001あいう' 3ret = re.sub(r'宇宙世紀([0-9]{4})', r'U.C.\1',s) # カッコ内の文字は置換後に\1などで参照できる 4print(ret) # U.C.0001あいう

投稿2019/01/30 07:51

can110

総合スコア38230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gran-1123

2019/01/30 08:22

試した所 TypeError: expected string or bytes-like object というエラーが出ました。 おそらく既にリスト化しているものに施したのが原因と推測しましたが、何か解決策はありますでしょうか?
can110

2019/01/30 08:35

回答コードのように、文字列に対して処理ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問