2

だから、文中の単語(完全な単語)を見つけようとしています。文が

Str1 = "1. how are you doing"

そして、私は次のことを見つけることに興味があります

Str2 = "1."

その中にあります。私が行った場合、

re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)

一致が見つかったと言うべきですよね?しかし、re.searchこのクエリでは失敗します。なぜ?

4

1 に答える 1

6

ここには 2 つの問題があります。

  1. \b単語と単語以外の文字の間、つまり任意の文字、数字、またはアンダースコアと、そのセットに一致しない文字の間の位置に一致します。

    .aとスペースの境界を一致させようとしています。どちらも単語以外の文字であり、\bアンカーはそこで一致することはありません。

  2. これは、「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. '
于 2013-10-29T14:26:30.107 に答える