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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

1911閲覧

Python3.11における正規表現の書き方について

Tallind

総合スコア8

Python 3.x

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2023/09/13 07:32

実現したいこと

いままで問題なく動いていたプログラムがPython3.11にしたところうまく動かなくなってしまいました。
調べたところ3.11では正規表現の書き方に変更があったようなのですが、どこを直せばよいのかわかりません。
ご教示のほどよろしくお願いいたします

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

Traceback (most recent call last): File "/home//Documents/selenium/aaa.py", line 177, in getpasscode passcode_txt = re.sub(r'\d{4,6}yen|\d{4,6}(?i)pon|http.*? ', " ", code) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/__init__.py", line 185, in sub return _compile(pattern, flags).sub(repl, string, count) ^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/__init__.py", line 294, in _compile p = _compiler.compile(pattern, flags) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/_compiler.py", line 743, in compile p = _parser.parse(p, flags) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/_parser.py", line 980, in parse p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/_parser.py", line 455, in _parse_sub itemsappend(_parse(source, state, verbose, nested + 1, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/re/_parser.py", line 841, in _parse raise source.error('global flags not at the start ' re.error: global flags not at the start of the expression at position 16

該当のソースコード

Python

1code = re.sub(r'\d{4,6}yen|\d{4,6}(?i)pon|http.*? ', " ", code )

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

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

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

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

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

melian

2023/09/13 07:57 編集

re.sub(r'\d{4,6}yen|\d{4,6}(?i:pon)|http.*? ', " ", ...)
guest

回答1

0

ベストアンサー

re.error: global flags not at the start of the expression

エラーにあるとおり、global flag => (?i) が先頭にないからです。

pythonの正規表現のフラグの書き方は、公式だとちょとわかりにくいのですが、たとえば以下のサイトで解説されていますが、 質問の書き方だと (?i)は全体にかかることになります
https://www.javadrive.jp/python/regex/index17.html

そして、3.11では、それを明確にするために、先頭に書かなければならなくなりました。
。なので、正しくは以下のようになります。

python

1code = re.sub(r'(?i)\d{4,6}yen|\d{4,6}pon|http.*? ', " ", code )

また、 「pon」のところだけ効かせたいのであれば、以下のようにすることになります。(これは以前からそういう仕様です。

python

1code = re.sub(r'\d{4,6}yen|\d{4,6}(?i:pon)|http.*? ', " ", code )

投稿2023/09/13 08:03

TakaiY

総合スコア14001

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

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

Tallind

2023/09/13 12:11

わかりやすく記載いただき助かりました! ありがとうございます。
otn

2023/09/14 05:23 編集

> 質問の書き方だと (?i)は全体にかかることになります 知らなかったので、Perl Rubyも含め調べてみました。 (?i) を途中に書いた場合、 Python 3.9:全体に効く(警告は出るが)。公式ドキュメントに記載あり。 Python 3.11:エラー。公式ドキュメントに記載あり。 Ruby: 書いた場所以降にだけ効く。公式ドキュメントに記載あり。動作確認したのは3.2だが1.8.7のドキュメントにも/A(?i)a(?-i)A/という例があるので昔からこういう仕様。 Perl 5.32: 書いた場所以降にだけ効く。見た限りでは公式ドキュメントに記載なしなのでバージョンによるかも。ただRubyの仕様からしてPerlも昔からこうだったと思いますが。 注:以降に効くと言っても、a(b(?i)c)d の場合は、括弧があるので c にだけ効いて d には及びません。 Pythonだけ方針が違う原因が分からない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問