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

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

新規登録して質問してみよう
ただいま回答率
86.02%
正規表現

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

Pythonの正規表現がうまくいきません

Yamachan
Yamachan

総合スコア1

正規表現

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0グッド

0クリップ

221閲覧

投稿2023/01/22 03:33

Pythonの正規表現について
空行(\n\n)で文章を区切るために、

python

1re.split(r’\n\n’, text)

としたのですが、改行(\n)の箇所でも文章が区切られてしまいます。
空行で区切って改行で区切らない正規表現を教えてください。

以下のような質問にはグッドを送りましょう

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

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

2023/01/22 05:30

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

TakaiY

2023/01/22 03:51 編集

「改行(\n)の箇所でも文章が区切られてしま」うということはないと思いますが、そう判断したときの文字列データと結果を教えていただけますか。
Yamachan

2023/01/22 06:05

勘違いをしていて、仰る通り\nで区切られてしまうことはありませんでした。 https://peps.python.org/pep-0020/ ところで実際は、この文章を"."と"!"と"\n\n"で区切りたいのですが、変数textに上の文章を代入して ```python sentences = re.split(r'[!|.|(\n\n)]', text) print(sentences) ``` とすると、'Readability', 'counts'のように改行部分で区切られてしまいます。 よろしければ、改行で区切られない方法を教えてください。 (以下略文) parse is better than dense. Readability counts. Special cases aren't special enough to break(続く) このような感じの文章です
TakaiY

2023/01/22 08:32 編集

「"."と"!"と"\n\n"で区切りたい」のであれば、 [!|.|(\n\n)] ではありません。 []は中の何れかの文字で区切るときに使います。文字ごとなので、これだと改行も含まれてしまいます。 (「|」も含まれますね) グループ毎の何れかしたいのであれば、 (?:!|\.|\n\n) でしょうか。 (回答っぽいので、回答にコピーしときました)
Yamachan

2023/01/22 09:56

ご回答ありがとうございます。 しかしながら、上手くいきませんでした。 [' ', ' ', ' ', ... , ' \n', ... ' ']と出力されました。 !|.|\n\nでも試しましたが、1文字ずつに区切れてしまいました。

回答2

1

python

1text = 'a aa\n\nbbb\ncc c\nddd\n\neee' 2import re 3 4# # \n\n が2連続したら split 5res = re.split(r'(\n\n)', text) 6print(res) 7# 出力結果 ['a aa', '\n\n', 'bbb\ncc c\nddd', '\n\n', 'eee'] 8 9# \n\n が不必要ならば、res リストから削除する 10filltered = list(filter(lambda x: x!='\n\n', res)) 11 12print(filltered) 13# 出力結果 ['a aa', 'bbb\ncc c\nddd', 'eee']

できれば正規表現だけで処理したかったですが、あんまり得意ではないので

投稿2023/01/22 05:31

yosukesan

総合スコア34

Yamachan👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

melian

2023/01/22 05:36

\n\n が不要な場合は、res = re.split(r'\n\n', text) でよいのではないでしょうか。

0

ベストアンサー

「"."と"!"と"\n\n"で区切りたい」のであれば、
[!|.|(\n\n)] ではありません。 []は中の何れかの文字で区切るときに使います。文字ごとなので、これだと「!か|か.か|か\nか\nか」となってしまい 改行も含まれてしまいます。

グループ毎の何れかしたいのであれば、
(?:!|\.|\n\n)
でしょうか。
(?: ) にしないと、マッチしたものそのものも含まれてしまいます。

投稿2023/01/22 08:31

編集2023/01/22 10:27
TakaiY

総合スコア10513

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

otn

2023/01/22 10:19

> これだと「!か|か.か|か\nか\nか」となってしまい ( と ) もですね。
otn

2023/01/22 10:22

(?:!|\.|\n\n) か (?:[!.]|\n\n) ですね。
TakaiY

2023/01/22 10:28 編集

ああ、原稿には入ってるのですが、エスケープしないとだめなんですね。 直しておきます。
Yamachan

2023/01/23 01:49

お二方、ありがとうございます。望みどおりに区切れました。 最後に1つ質問させてください。 "?:"は、どういった働きをしているのかが分かりません。 少し調べましたが、理解できませんでした..
TakaiY

2023/01/23 05:33

?: を外して使ってみるとわかりますが、正規表現での() にはグループ化の他にキャプチャという機能があります。(?: xxx) とすると、 キャプチャ無しでグループ化だけすることができます。 ?: 無しで実行すると、リストの中に区切りとして指定された.や!も含まれていることがわかると思います。キャプチャされているため、抽出の候補となっているわけです。 質問の例ではそれらは必要ないようなので、()のキャプチャの機能だけ無効化するため、?: を加えています。 公式だとここで説明されています。 https://docs.python.org/ja/3/library/re.html

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

正規表現

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。