だから、文中の単語(完全な単語)を見つけようとしています。文が
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.
1
re.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. '