私はパズルを解くアプリケーションをPythonで書いています。私はいくつかの文字の組み合わせを探していますが、文字セット[abcd]があれば、abcdという文字だけを含むテキストの中にサブ文字列を見つける必要があります。文字abcdはdcbaまたはabbcddと一致しますが、acd、bbcdまたはabcedは一致しません。正規表現[abcd] +を使用すると、各文字が含まれていない部分文字列が得られます正規表現は少なくとも一度は各文字に一致します
答えて
なぜ正規表現を使用しますか?
def hasChars(search_string, chars):
return all(x in search_string for x in chars)
>>> hasChars('aaabcd', 'abc')
True
文字列は、少なくともABCD含まれている必要がありますが、他の人を含めることができる場合だけでなく、彼らは唯一のABCD含めることができ、場合、これは
(?=.*a)(?=.*b)(?=.*c)(?=.*d)
を働くだろう、これはおそらく
優れています^(?=.*a)(?=.*b)(?=.*c)(?=.*d)[abcd]+$
更新
あなたは、フローティングバージョンを探している場合は、質問に答えるために、これはあなたが欲しいものを行います。
(?=([abcd]{4,}))(?=[bcd]*a)(?=[acd]*b)(?=[abd]*c)(?=[abc]*d)\1
が拡張:
# At POSition
(?= # Lookahead
( # Capture grp 1
[abcd]{4,} # Get 4 or more (greedy) 'a' or 'b' or 'c' or 'd' characters
)
)
(?= # Lookahead, check for 'a' (still at POS)
[bcd]*a # 0 or more [bcd]'s then 'a'
)
(?= # Lookahead, check for 'b' (still at POS)
[acd]*b # 0 or more [acd]'s then 'b'
)
(?= # Lookahead, check for 'c' (still at POS)
[abd]*c # 0 or more [abd]'s then 'c'
)
(?= # Lookahead, check for 'd' (still at POS)
[abc]*d # 0 or more [abc]'s then 'd'
)
\1 # Backref to capt grp 1, consume it
# Passed test, now at POSition + length of capture group 1
より
ます検索文字列から正規表現を体系的に構築できるかもしれません。私はよくそのpythonを知らないので、ここではPerlでそれを行う方法のサンプルです。文字列が長ければ長いほど、マッチを見つけるのに時間がかかるが、これはかなり速くなるはずであることに注意してください。
use strict;
use warnings;
my $samp = 'bddaaabcabbad characters abcd matches dcba or abbcdd, but not acd, bbcd or abced';
my $regex = '(?=([abcd]{4,}))(?=[bcd]*a)(?=[acd]*b)(?=[abd]*c)(?=[abc]*d)\1';
while ($samp =~/$regex/xg)
{
print "Found '$1'\n";
}
# Regex construction
# ------------------------------
my @AryofSearchStrs = (
'abcd',
'%^&*',
'hi()there',
'==-yes',
);
for my $search_string (@AryofSearchStrs)
{
my $str = $search_string;
while($str =~ s/(.)(.*)\1/$1$2/g) {}
my @astr = split '', $str;
my $rxformed = '(?=([' . quotemeta($str) . ']{' . length($str) . ',}))';
for (my $i = 0; $i < @astr; $i++)
{
$rxformed .=
'(?=['
. join('', map { quotemeta($_) } @astr[0..($i-1), ($i+1)..$#astr])
. ']*'
. quotemeta($astr[$i])
. ')';
}
$rxformed .= '\1';
print "\n\n============\n";
print "Search string = '$search_string'\n";
print "Normalized = '$str'\n";
print "Formed regex = \n$rxformed\n";
}
出力は
Found 'bddaaabcabbad'
Found 'abcd'
Found 'dcba'
Found 'abbcdd'
============
Search string = 'abcd'
Normalized = 'abcd'
Formed regex =
(?=([abcd]{4,}))(?=[bcd]*a)(?=[acd]*b)(?=[abd]*c)(?=[abc]*d)\1
============
Search string = '%^&*'
Normalized = '%^&*'
Formed regex =
(?=([\%\^\&\*]{4,}))(?=[\^\&\*]*\%)(?=[\%\&\*]*\^)(?=[\%\^\*]*\&)(?=[\%\^\&]*\*)\1
============
Search string = 'hi()there'
Normalized = 'hi()ter'
Formed regex =
(?=([hi\(\ \)ter]{8,}))(?=[i\(\ \)ter]*h)(?=[h\(\ \)ter]*i)(?=[hi\ \)ter]*\()(?=[hi\(\)ter]*\)(?=[hi\(\ ter]*\))(?=[hi\(\ \)er]*t)(?=[hi\(\ \)tr]*e)(?=[hi\(\ \)te]*r)\1
============
Search string = '==-yes'
Normalized = '=-yes'
Formed regex =
(?=([\=\-yes]{5,}))(?=[\-yes]*\=)(?=[\=yes]*\-)(?=[\=\-es]*y)(?=[\=\-ys]*e)(?=[\=\-ye]*s)\1
ありがとう!後者の方法では文字列全体を一致させることができますが、実際には文字列を文字列内の部分文字列として実際に探す必要があります。私は実際に上記の方法がどのように機能するのかわからないので、それから作業するのに問題があります。私は上記の構文要素をカバーする正規表現のチュートリアルを終えましたが、この文脈でどのように使われているのか分かりません。これを理解する正しい方向のどの点でも大いに感謝します。 –
@python whisperer - 必要な部分文字列を得るための正規表現と説明を追加しました。いつものように、あなたがこれらの有用なものを見つけたら、アップアップして回答を受け入れてください(あなたがまだできたら)。 – sln
- 1. 少なくとも文字またはスペースに一致する正規表現
- 2. Perlの正規表現は少なくとも一致しますが、
- 3. 文字列または正規表現のリテラルにない正規表現と一致する正規表現
- 4. 正規表現は大文字と一致します。
- 5. 少なくともn個のmグループに一致する正規表現
- 6. 正規表現と一致しない文字と一致する正規表現
- 7. 正規表現文字列が一致?
- 8. 正規表現正規表現一致文字列
- 9. n文字または少なくともm文字の正規表現
- 10. 正規表現は2つの単語または少なくとも1つに一致します
- 11. 少なくとも3つのダッシュ/ハイフンを含む文字列と一致する正規表現
- 12. 部分文字列ではなく文字列での正規表現一致
- 13. 少数の文字と数字だけを一致させる正規表現
- 14. 正規表現:いくつかの文字と一致するか、または一致しない文字と一致します
- 15. 文字列の一部または全部と一致する正規表現
- 16. 正規表現に一致する1文字と空白が続く文字
- 17. 正規表現hrefは数字と一致します
- 18. 正規表現:部分一致または完全一致の文字列
- 19. 大文字または小文字のクエリーストリングと一致する正規表現
- 20. 任意の文字に一致する正規表現内の正規表現
- 21. 文字列間の正規表現に一致する正規表現
- 22. 正規表現に一致しない正規表現
- 23. 少なくとも1文字と1文字の正規表現
- 24. 正規表現と完全に一致する文字列
- 25. 長さと文字に一致する正規表現
- 26. 正規表現一致する2文字の文字数
- 27. Python正規表現一致後の文字が一致しません
- 28. PHP正規表現が一致しないポリッシュ文字
- 29. 正規表現の最初の文字が一致しない
- 30. 一致しない部分文字列の正規表現
あなたはPythonのタグを追加する必要があります。あなたはまた、あなたがすでに試したことを示し、何がうまくいかないかを説明する必要があります。これはGIMME DA CODEサイトではありません。 – tchrist
詳細を教えてください。これはあまりにも曖昧です。 –