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

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

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

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

Python

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

Q&A

解決済

2回答

1124閲覧

ある文字列から1文字だけ異なる正規表現

horiegom

総合スコア152

正規表現

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

Python

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

1グッド

1クリップ

投稿2022/10/31 02:54

実現したいこと

ある文字列(例えば QWERTY とします)から1文字だけ置換された文字列を正規表現で検索したいです。

例えば
(マッチする文字列)
QWERTQ
AWERTY
QWERYY
QWEETY
(マッチしない文字列)
QWERQQ:2文字異なる
QWERTYT:置換ではない。文字数が異なる
QWER  :文字数が異なる。

愚直に書くと以下の様になります、シンプルに表現する方法はありますか?

(AAAAA.?)|(AAAA.?A)|(AAA.?AA)|(AA.?AAA)|(A.?AAAA)|(.?AAAAA)

環境、言語は特に指定するものではありませんが、pythonで実装しています。

melian😄を押しています

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

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

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

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

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

melian

2022/10/31 03:49

正規表現以外の方法ではダメなのでしょうか?
Zuishin

2022/10/31 04:43

正規表現を固定ではなく文字列に合わせて自動生成するのが良いと思います。 つまり、質問に掲載されているようなものを自動的に作成すると良いでしょう。 具体的には、与えられた文字列を各文字に分解し、それをエスケープした文字列とドットから全ての組み合わせを生成し、それを垂直バーで連結します。
yambejp

2022/10/31 04:50

わざわざ正規表現を使用しなくても、先頭から1文字ずつ評価するユーザー関数を用意すれば良いだけのような気がします。
Zuishin

2022/10/31 05:30

. でなく .? なので、正規表現の方が簡単になりそうな気がします。完全一致ではなく文字列中から検索しなければならないとしたら特に。
yambejp

2022/10/31 06:08

> . でなく .? なので いや「文字数が異なる」がNGなら「.?」ではないですね質問者さんの正規表現への理解が低いだけだと思います
Zuishin

2022/10/31 06:18 編集

文字数が異なるのは二文字違うからだと理解していました。その上を見ると一文字違いでも違うとみなされていますね。同じ文字数なら順に比べて二文字以上違わなければマッチしたとみなせば確かに簡単ですね。
horiegom

2022/11/01 00:27

「.?」ではなく[.]の誤りです。 モチベーションのひとつに正規表現を利用可能な検索サイトで、当該検索を行うことだったのでユーザー関数はその場合適していないと考えていました。
Zuishin

2022/11/01 00:35

ベストアンサーの回答はマッチに関数を使ってますが。
yambejp

2022/11/01 00:36

「.」だと「1文字だけ置換された文字列」は拾えませんよ 同じでもヒットしますので
horiegom

2022/11/02 04:57

>yambejp 記載忘れていましたが、同じでも問題ありません
horiegom

2022/11/02 05:23

>Zuishin [モチベーションのひとつ]
Zuishin

2022/11/02 05:56

ロジックの苦手な人はプログラミングに向きません。 関数でいいなら関数でいいはずです(小泉構文)。
horiegom

2022/11/02 07:18

質問に関係のない主義主張は他所でお願いします。
Zuishin

2022/11/02 07:22 編集

関係は大ありですが、理解できないなら書くのはやめましょう。何か返信が欲しいなら続きをどうぞ。不要ならそのまま何も書く必要はありません。
horiegom

2022/11/02 07:23

[ロジックの苦手な人はプログラミングに向きません。]が質問に関係のない主義主張に該当すると判断します。
Zuishin

2022/11/02 07:24

私の言ったことが理解できないので説明が欲しいということですか? それなら返事をしてください。 不要なら何も書く必要はありません。
horiegom

2022/11/02 07:25

これ以上何も書かないでください。
Zuishin

2022/11/02 07:27

そのように何度も書いていますが、まだ何か?
horiegom

2022/11/02 07:28

これ以上何も書かないでください。
guest

回答2

0

ベストアンサー

pythonで実装しています。

Python には regex · PyPI パッケージがあって、Fuzzy Matching という機能が提供されています。

python

1import regex 2 3word = 'QWERTY' 4target = ['QWERTQ', 'AWERTY', 'QWERYY', 'QWEETY', 5 'QWERQQ', 'QWERTYT', 'QWER'] 6 7for t in target: 8 m = regex.search(rf'(^{word}$){{s<=1}}', t) 9 print(f'{t}: {"not matched" if m is None else "matched"}') 10 11# 12QWERTQ: matched 13AWERTY: matched 14QWERYY: matched 15QWEETY: matched 16QWERQQ: not matched 17QWERTYT: not matched 18QWER: not matched

{s<=1} における ssubstitution の略で、「置換文字は最大で1文字」という意味です。なので、QWERTY にもマッチしてしまいます。その辺は適宜除去しておく必要があります。

投稿2022/10/31 04:22

melian

総合スコア21109

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

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

0

kotlin

1 val pattern = """^([^Q]WERTY|Q[^W]ERTY|QW[^E]RTY|QWE[^R]TY|QWER[^T]Y|QWERT[^Y])$""".toRegex() 2 3 listOf( 4 "QWERTY", 5 "qWERTY", 6 "QwERTY", 7 "QWeRTY", 8 "QWErTY", 9 "QWERtY", 10 "QWERTy", 11 "qwERTY", 12 "qWeRTY", 13 "qwerty", 14 "ABCDEF", 15 ) 16 .forEach { text -> 17 println("${text} : ${pattern.matches(text)}") 18 }
QWERTY : false qWERTY : true QwERTY : true QWeRTY : true QWErTY : true QWERtY : true QWERTy : true qwERTY : false qWeRTY : false qwerty : false ABCDEF : false

投稿2022/10/31 03:11

shiketa

総合スコア4114

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問