だから、文中の単語(完全な単語)を見つけようとしています。文が
Str1 = "1. how are you doing"
そして、私は次のことを見つけることに興味があります
Str2 = "1."
その中にあります。私が行った場合、
re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)
一致が見つかったと言うべきですよね?しかし、re.searchこのクエリでは失敗します。なぜ?
だから、文中の単語(完全な単語)を見つけようとしています。文が
Str1 = "1. how are you doing"
そして、私は次のことを見つけることに興味があります
Str2 = "1."
その中にあります。私が行った場合、
re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)
一致が見つかったと言うべきですよね?しかし、re.searchこのクエリでは失敗します。なぜ?
ここには 2 つの問題があります。
\b単語と単語以外の文字の間、つまり任意の文字、数字、またはアンダースコアと、そのセットに一致しない文字の間の位置に一致します。
.aとスペースの境界を一致させようとしています。どちらも単語以外の文字であり、\bアンカーはそこで一致することはありません。
これは、「aと他の文字に一致する」ことを意味しreます。リテラルに一致させるには、を使用してドットをエスケープする必要があります。1.1re.escape().
次のほうがうまくいきます。
re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
これで、文字どおり入力に一致し、次のスペースまたは文字列の末尾を探します。は(?:...)、非キャプチャ グループを作成します (特にマッチの一部をキャプチャする必要がない限り、常に良い考えです)。グループ内には、|2 つの選択肢を与えるためのパイプがあります。一致\s(空白) または一致 (行末)$のいずれかです。これは必要に応じて拡張できます。
デモ:
>>> import re
>>> Str1 = "1. how are you doing"
>>> Str2 = "1."
>>> re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
<_sre.SRE_Match object at 0x10457eed0>
>>> _.group(0)
'1. '