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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

1667閲覧

Pythonの構文エラー

tasss

総合スコア12

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2017/01/19 10:46

Pythonでwebからもってきたプログラムを使って、実装しようとしています

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

SyntaxError: ('invalid syntax', ('wiki.py', 1180, 62, " afterPat = {o:re.compnPat + '|' + c, re.DOTALL) for o c in zip(openDelim, closeDelim)}\n"))

該当のソースコード

引用テキスト

def findBalanced(text, openDelim=['[['], closeDelim=[']]']): """ Assuming that text contains a properly balanced expression using :param openDelim: as opening delimiters and :param closeDelim: as closing delimiters. :return: an iterator producing pairs (start, end) of start and end positions in text containing a balanced expression. """ openPat = '|'.join([re.escape(x) for x in openDelim]) # pattern for delimiters expected after each opening delimiter afterPat = {o: re.compile(openPat + '|' + c, re.DOTALL) for o, c in zip(openDelim, closeDelim)} stack = [] start = 0 cur = 0 # end = len(text) startSet = False startPat = re.compile(openPat) nextPat = startPat while True: next = nextPat.search(text, cur) if not next: return if not startSet: start = next.start() startSet = True delim = next.group(0) if delim in openDelim: stack.append(delim) nextPat = afterPat[delim] else: opening = stack.pop() # assert opening == openDelim[closeDelim.index(next.group(0))] if stack: nextPat = afterPat[stack[-1]] else: yield start, next.end() nextPat = startPat start = next.end() startSet = False cur = next.end()

初心者なので、この構文のどこが間違っているか分かりません。よろしくお願いします。

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

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

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

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

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

matobaa

2017/01/19 11:41

python -V を実行するとどんな出力が得られますか
tasss

2017/01/19 11:45

コメントありがとうございます。2.6.6とでました。
guest

回答2

0

ベストアンサー

Pythonのバージョンが2.7未満であることが原因です。
Dict {k:v, ... } における内包表記 for target_list in or_list が使えるのは Python 2.7以降です。
参考: PEP 274

辞書内包表記を使わないように書き換えることもできるかと思いますが、Pythonのバージョンを上げられるなら、そのほうが早いでしょう。

投稿2017/01/20 00:50

編集2017/01/20 00:54
matobaa

総合スコア2493

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

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

tasss

2017/01/20 00:52

なるほど!ありがとうございました! バージョンを上げ直してもう一度トライします!
guest

0

エラーメッセージと実際のコードに差異がありますが、単にコードを誤って消してしまった等ではありませんでしょうか
エラーメッセージ
afterPat = {o:re.compnPat + '|' + c, re.DOTALL) for o c in zip(openDelim, closeDelim)}
実際のコード
afterPat = {o: re.compile(openPat + '|' + c, re.DOTALL) for o, c in zip(openDelim, closeDelim)}

re.compileがre.compnPat担っています。

投稿2017/01/19 11:04

H.Mayu

総合スコア16

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

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

tasss

2017/01/20 00:54

コメントありがとうございます! エラー表記の件ですが、初めからエラーが出ていたので、自分で試行錯誤した際に表記が抜けていました。 申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問