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

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

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

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

Python

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

Q&A

解決済

2回答

709閲覧

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

Yamachan

総合スコア1

正規表現

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

Python

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

0グッド

0クリップ

投稿2023/01/22 03:33

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

python

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

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

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

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

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

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

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

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文字ずつに区切れてしまいました。
guest

回答2

0

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

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

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

melian

2023/01/22 05:36

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

0

ベストアンサー

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

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

投稿2023/01/22 08:31

編集2023/01/22 10:27
TakaiY

総合スコア12765

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

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

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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問