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

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

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

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

正規表現

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

Q&A

解決済

4回答

626閲覧

Python 正規表現:特定の文字列を前後に含まない記載方法

john_doe_

総合スコア354

Python 3.x

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

正規表現

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

0グッド

0クリップ

投稿2021/11/09 11:53

編集2021/11/09 12:22

下記のテキストから”傷害”のみを抽出する正規表現の記載方法を検討しています。

text = "業務上過失傷害, 過失傷害致死容疑, 傷害致死容疑, 傷害容疑"

期待するoutput: ['傷害']

試したこと:
(!?〜)を利用して前後に出現する文字列を除外しようとした。

text = "業務上過失傷害, 過失傷害致死容疑, 傷害致死容疑, 傷害容疑" re.findall("(?!過失)傷害(!?致死)", text) output:['傷害', '傷害'] # 2つ該当する。。。 text = "業務上過失傷害、過失傷害致死容疑, 傷害致死容疑, 傷害容疑" re.findall("(?!過失)傷害", text) output:['傷害', '傷害', '傷害', '傷害'] # 複数該当してしまう。。。。

大変稚拙な質問かとは存じますが、ご存知の方おられましたらご教示いただけると幸甚です。
何卒よろしくお願い申し上げます。

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

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

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

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

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

itagagaki

2021/11/09 12:02

何を抽出したいのかがちょっとよくわからないので質問に補充してください。 補充していただきたいのは、 text = "業務上過失傷害, 過失傷害致死容疑, 傷害致死容疑, 傷害容疑" から、どういう理屈で output: ['傷害'] を期待しているのか、です。
john_doe_

2021/11/09 12:08

ご質問ありがとうございます。言葉足らずで大変失礼いたしました。 刑法違反の種類で単純に「傷害」にのみ該当する正規表現を検討しており、 このような質問をさせていただきました。
guest

回答4

0

ベストアンサー

直前に「過失」が無く、直後に「致死」が無い「傷害」という文字列を抽出せよ
という意味でしたら、↓のようになるかと思います。

import re text = "業務上過失傷害, 過失傷害致死容疑, 傷害致死容疑, 傷害容疑" re.findall("(?<!過失)傷害(?!致死)", text)

?<!は否定後読みと呼ばれる表現で「直前に○○が無い」ことを示します

投稿2021/11/09 12:44

編集2021/11/09 12:47
coffeebar

総合スコア140

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

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

john_doe_

2021/11/09 12:47

解決策をご教示いただきましてありがとうございます。 ?<! の意味がわからないです。。。。
john_doe_

2021/11/09 12:49

稚拙な質問にも関わらず、ご親切に対応くださり、大変勉強になりました。 ありがとうございました!!!
guest

0

Python

1re.findall("(?!過失)傷害(!?致死)", text)

これは意図としては

Python

1re.findall("(?<!過失)傷害(?!致死)", text)

の誤りだと思うので、こう直したらいかがでしょうか。

投稿2021/11/09 12:25

itagagaki

総合スコア8402

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

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

john_doe_

2021/11/09 12:33

ご親切にご教示いただきままして誠にありがとうございます。 < の意味は何か教えていただけないでしょうか? 下記で調べてみたのですが、自己解決できませんでした。。。 https://docs.python.org/ja/3/library/re.html
itagagaki

2021/11/09 12:50

そのページにも載っていますよ (?<!...) その文字列における現在位置の前に ... とのマッチがなければ、マッチします。これは 否定後読みアサーション(negative lookbehind assertion) と呼ばれます。肯定後読みアサーションと同様に、含まれるパターンは固定長の文字列にのみマッチしなければなりません。否定後読みアサーションで始まるパターンは検索される文字列の先頭でマッチできます。
john_doe_

2021/11/09 16:25

ご丁寧な説明ありがとうございます。大変助かりました。
guest

0

re.searchを利用するのはどうでしょうか?

python

1>>> import re 2>>> text = "業務上過失傷害, 過失傷害致死容疑, 傷害致死容疑, 傷害容疑" 3>>> re.search("傷害", text).group() 4'傷害'

投稿2021/11/09 12:07

neko_the_shadow

総合スコア2273

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

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

john_doe_

2021/11/09 12:21

早速、ご教示いただき誠にありがとうございます。言葉足らずで大変失礼しております。 実は、”傷害”と”業務上過失傷害”の双方のパターンを検出することも考えているため、 re.findall("傷害|業務上過失傷害", text)の発展型を理想としております。 なので、前後に指定の文字列を含まない正規表現の記載方法を模索しております。
guest

0

python~~ ~~>>> re.findall("(?<!過失)(傷害)致死", text)~~ ~~['傷害']~~ ~~

投稿2021/11/09 12:56

編集2021/11/09 13:00
melian

総合スコア19874

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

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

melian

2021/11/09 13:00

間違えてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問