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

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

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

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

解決済

pythonの正規表現で「excelのセルの参照元」を調べたい 【プログラミング初心者です】

minato007
minato007

総合スコア1

Python 3.x

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

1回答

0リアクション

1クリップ

235閲覧

投稿2022/09/29 06:04

編集2022/09/29 06:49

前提

卒業論文でexcelのセルの参照元を調べる必要が出てきました。
しかし、あまりにも参照元が多く、地道に調べるのは大変なため、少しかじったことのあるpythonで調べたいと思いました。
初歩的な質問かもしれませんが、よろしくお願いします。

実現したいこと

pythonでexcelのセルの参照元を調べたいです。
具体的に言うと、N43のセルが

N43 =IF(K43="-","-",IF(NOT(ISNUMBER(I43)),"",IF(OR(AND(J43="≤",ROUND(I43,1)<=K43),AND(J43="≥",ROUND(I43,1)>=K43)),Data!$C$273,Data!$C$272)))

となっている場合、

["K43", "I43", "J43", "C273", "C272"]

と表示できるようにしたいです。

このなかで、"$"のついていない"K43", "I43", "J43"については正規表現で表示できましたが、"$"のついている"$C$273", "$C$272"について表示できなくて困っています。

最終的には、求めることができたセルに対しても同様にさらにその参照元を調べるために、再帰させようと思っています。以下のコードの後半はそのための準備になっています。そこに関してもアドバイスがあればいただきたいです。

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

【ご報告】ご指摘をいただき、誤字の修正をした結果、下記エラーが出るようになりました。
検証をこれから行いますが、ご助力いただければ幸いです。

ValueError: 272 is not in range The above exception was the direct cause of the following exception: Traceback (most recent call last): File "“●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●”", line 70, in <module> print(get_duplicate_list_order(map1(link_search_01, new_ret1))) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●””, line 64, in map1 return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) [Previous line repeated 6 more times] File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 40, in link_search_01 text = dfs[sname.index(ws)].loc[cell_no-1,cell_alpha] File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 925, in __getitem__ return self._getitem_tuple(key) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1100, in _getitem_tuple return self._getitem_lowerdim(tup) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 838, in _getitem_lowerdim section = self._getitem_axis(key, axis=i) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1164, in _getitem_axis return self._get_label(key, axis=axis) File ““●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●””, line 1113, in _get_label return self.obj.xs(label, axis=axis) File "●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●\●●●●●●", line 3776, in xs loc = index.get_loc(key) File " ●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●\●●●●●●●●●\●●●●●●\●●●●●●", line 387, in get_loc raise KeyError(key) from err KeyError: 272

該当のソースコード

python

from openpyxl import load_workbook import docx import requests import pandas as pd, openpyxl as xl, re, itertools from string import ascii_uppercase excel_path="●●●●●\●●●●●●●●●●\●●●●●●\●●●●●●●●●●●●" workbook = load_workbook(filename=excel_path, read_only=True) load_sheet1 = input("調べたいシート :") sheet1 = workbook[load_sheet1] load_cell1 = input("調べたいセル :") # 取得した値の表示 if load_cell1 == "" : print("null") else : print(load_sheet1,load_cell1,sheet1[load_cell1].value) dfs = [] sname = [] def iter_all_strings(): for size in itertools.count(1): for s in itertools.product(ascii_uppercase, repeat=size): yield ''.join(s) for ws in workbook.worksheets: df = pd.DataFrame(ws.values) clst = [] for s in itertools.islice(iter_all_strings(), df.shape[1]): clst.append(s) df.columns = clst dfs.append(df) sname.append(ws.title) def link_search_01(ws, cell): cell_no = int(re.sub(r'\D', '', cell)) cell_alpha = re.sub(r'(\W|\d)', '', cell) text = dfs[sname.index(ws)].loc[cell_no-1,cell_alpha] #セルの計算式 #------------------------------------------------------------------------------------ # 以下の1行を付け加えた #------------------------------------------------------------------------------------ new_text = re.sub("\$" , "", text) results_01 = [] regex1 = re.compile(r'[A-Z]+\d+') #------------------------------------------------------------------------------------ #results_01.append(regex1.findall(text)) #------------------------------------------------------------------------------------ results_01.append(regex1.findall(new_text)) ret1 = list(itertools.chain.from_iterable(results_01)) return(ret1) print(ret1) link_search_01(load_sheet1,load_cell1) new_ret1 = link_search_01(load_sheet1,load_cell1) def get_duplicate_list_order(seq): seen = [] return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1] print(get_duplicate_list_order(new_ret1)) def map1(link_search_01, new_ret1): if new_ret1 == []: return [] else: return [link_search_01(load_sheet1,new_ret1[0])] + map1(link_search_01,new_ret1[1:]) def get_duplicate_list_order(seq): seen = [] return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1] print(get_duplicate_list_order(map1(link_search_01, new_ret1)))

python

#今回のinputの内容 load_sheet1 = ●●●●● load_cell1 = N43

python

#結果 ['K43', 'I43', 'J43'] [['AI43', 'AQ43'], ['N27', 'N27'], []]

試したこと

上記コードにコメントアウトしたように、元のセルの計算式から"$"を省き、それをもとに正規表現でセルを調べようとしたのですが、コメントアウト部が思ったように稼働しませんでした。
コメントアウト部をなくすと、"$"なしのセルは正しく表示されます。

※誤字を修正した結果、エラーがでるようになりました。
検証はこれから行いますが、ご助力いただければ幸いです。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

can110

2022/09/29 06:13

正規表現"\$ "の最後に半角空白が含まれていますが、意図通りでしょうか(誤字?)
minato007

2022/09/29 06:23

失礼しました。誤字です。 修正しました。
can110

2022/09/29 06:34

修正したら、ちゃんと'C273', 'C272`も抽出できていないでしょうか?
minato007

2022/09/29 06:39

エラーが出るようになってしまいました。
can110

2022/09/29 07:04

検証結果が出ましたら追記ください。 pd.DataFrame(ws.values)だとセル値のない部分は読み込まれないので エラーのとおり範囲外アクセスしそうですが。
minato007

2022/09/29 16:30

Noneとなっているセルがあるため、修正ができないのだと思います。 そのうえで、どのようにすればよいのかがわかりません。 nanであれば、同じ欠損値でも扱いやすそうに感じていますが、調べた限りnanからNoneにする方法ばかりで、Noneからnanにする方法はわかりませんでした。
can110

2022/09/30 04:14

「ValueError: 272 is not in range」なのでそのセルにはアクセスできません。 範囲内か?セル値はあるか?計算式か?をチェックして、そうでなければ処理を終了するようにすべきかと思います。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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