🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

正規表現

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

Q&A

2回答

8823閲覧

特殊文字を含む文字列の検索

Osyante

総合スコア6

Python 3.x

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

正規表現

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

0グッド

0クリップ

投稿2019/11/16 07:25

前提・実現したいこと

pythonでHTMLを解析しています。
その中で "?p"という文字列を検索したいのですが、上手くいきません。

if re.search('?p',page) is not None: print page

これで?pが含まれる文字列だけが出力されると思いきや、
"?report=select"という文字列まで出力されてしまいます。

そこでRAW文字の検索なら出来るかと思い

if re.search(r'?p',page) is not None: print page

とやってみると
re.error: nothing to repeat at position 0
というエラーが表示されてしまいます。

pythonで「?p」という文字列を検索するにはどうすればいいでしょうか?

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

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

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

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

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

guest

回答2

0

これで?pが含まれる文字列だけが出力されると思いきや、

"?report=select"という文字列まで出力されてしまいます。

仕様です。"hoge?piyo" でもマッチするでしょう。
re.matchは先頭一致、re.searchは部分一致を試行します。

アンカー ^ $ を併用するか、re.fullmatchを使って下さい。

そこでRAW文字の検索なら出来るかと思い

?は正規表現中では特殊な意味を持ちますが、Pythonの文字列内ではただの文字です。
Python側でいくらraw文字列指定をしても意味はありません。

むしろバックスラッシュはエスケープ処理に使われるので、
正規表現は "?" あるいは r"?" にするとより丁寧でしょう。後者がより好ましいです。

投稿2019/11/16 07:30

編集2019/11/16 07:37
LouiS0616

総合スコア35668

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

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

Osyante

2019/11/16 07:40

ありがとうございます。成功したコードを見せていただけませんか?
LouiS0616

2019/11/16 07:47 編集

今気付いたのですが、re.searchを使っていると言えど 正規表現 ?p で ?report=select はマッチしないように思います。 実際に試してみてもマッチしません。https://wandbox.org/permlink/03k82U5Wm5z8h71X 編集しているコードと実行しているコードが違ったりしませんか?
Osyante

2019/11/16 08:01

個人情報等も含まれているので全体は載せられませんが、根幹部分は下記の通りです。 import re from bs4 import BeautifulSoup req = urllib.request.Request(url, None, headers) data = urllib.request.urlopen(req) html = data.read() soup=BeautifulSoup(html,'html.parser') data.close pages=[] pictures_id=[] root_links=[] for link in soup.find_all('a'): i =re.search(id_number,str(link.get('href'))) if i is not None: root_links.append(link.get('href')) print(root_links[0]) for page in root_links: if re.search('\?p',page) is not None: print(re.search(r'?p',page)) print(page)
LouiS0616

2019/11/16 08:03

間違いなくこのコードが実行されているでしょうか?print(re.search(r'?p',page)) でエラーを吐きそうなんですが...
Osyante

2019/11/16 08:10

質問文にも書きましたとおり、r を記述した方はエラーが出ます。 print(re.search('?p',page))としたほうは、?report=selectがマッチします。
Osyante

2019/11/16 08:47

お時間をいただき申し訳ありません。 では回答としては、re.search( ) 特殊文字前に\を置けば望んだ処理が出来るということでよいでしょうか?
LouiS0616

2019/11/16 09:02

というか ?p と完全一致するか判定したいだけなのであれば、正規表現を使わずとも "?p" == page で足りると思います。
Osyante

2019/11/16 09:14

??? 私は文字列の中から「特殊文字を含む文字列の検索」をしたいと最初から申し上げていますので、その方法を教えれほしいのですが、re.search( ) 特殊文字前に\を置けば望んだ処理が出来るということでよいでしょうか?
LouiS0616

2019/11/16 09:16

質問文について一つ確認したいのですが、 > if re.search('?p',page) is not None: > print page > これで?pが含まれる文字列だけが出力されると思いきや、 > "?report=select"という文字列まで出力されてしまいます。 ひょっとしてここでの『文字列』は『行』という意味で使っていますか?
Osyante

2019/11/16 09:23

ちょっとLouiSさんには難しそうですね。 自分で解決出来てしまいました。 ありがとうございました。
LouiS0616

2019/11/16 09:26 編集

自力で解決できるようなら良いんじゃないですかね。回答者として参加されてみてはいかがですか?
LouiS0616

2019/11/16 09:33

様々な質問の意図を読み取り、端的で正確な回答を心掛けるのはOsyanteさんにはちょっと難しいかもしれないですね。やってみないと分かりませんが。
guest

0

正しくは'\?p'またはr'?p'ですが、'?p'でも同じです。

プログラムが間違っていると思われるので、プログラム全体(実行できるもの)を載せましょう。

投稿2019/11/16 07:32

otn

総合スコア85888

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

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

Osyante

2019/11/16 07:43

全体を見せなくても下の方のようにわかると思います。 A="aeiruoiau_?p_akleja" P=re.search('?p',A) print(P)
otn

2019/11/16 11:22 編集

あ、全体じゃなくて、そのまま実行できて、現象が再現出来るものであればいいです。質問文のコードだと実行できませんので。 ↑これは正規表現の先頭にエスケープしてない「 ? 」 があるので、正規表現として不当ですね。 エラーになると思います。エスケープしましょう。 そのうえで、意図しない結果になるコードを実行できる形で載せてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問