Pythonで正規表現を使用して単語または単語の一部(文字列の最後にある場合)をキャプチャできるかどうか疑問に思いました。
例:
ターゲットワード-ジャガイモの
文字列-"これはジャガイモについての文です"
文字列-"これはジャガイモについての文です"文字列-"これはジャガイモについて
の別の文です"
ありがとう!
import re
def get_matcher(word, minchars):
reg = '|'.join([word[0:i] for i in range(len(word), minchars - 1, -1)])
return re.compile('(%s)$' % (reg))
matcher = get_matcher('potato', 4)
for s in ["this is a sentence about a potato", "this is a sentence about a potat", "this is another sentence about a pota"]:
print matcher.search(s).groups()
出力
('potato',)
('potat',)
('pota',)
Python で正規表現を照合する方法がわかりませんが、正規表現は次のようになります。
"\bp$|\bpo$|\bpot$|\bpota$|\bpotat$|\bpotato$"
これは、文字列の最後の単語である場合は ~ から任意の単語に一致しp
、potato
たとえば、「foopotato」のようなものには一致しません (これが必要な場合)。
は|
代替を示し、\b
は「単語境界」であるため、単語文字と単語以外の文字の間の位置 (文字ではない) に一致します。そして、$
文字列の末尾 (位置も) に一致します。
を使用し$
て、文字列の末尾に一致させます。たとえば、次の例は、文字列の末尾にある「potato」のみに一致します (最初の例)。
"potato$"
これはあなたのすべての例に一致します:
"pota[to]{1,2}$"
ただし、「potao」または「potaot」にも一致するリスクがあります。
import re
patt = re.compile(r'(p|po|pot|pota|potat|potato)$')
patt.search(string)
私は を使いたくなりましたが、それはpotoやpottr'po?t?a?t?o?$'
にもマッチします。
いいえ、私が知る限り、(p|po|pot ...)
過剰な無意味な一致がなければ、正規表現でそれを行うことはできません。代わりに、最後の単語を選択し、部分文字列を使用して一致させます。
match = re.search('\S+$', haystack)
if match.group(0) == needle[:len(match.group(0))]:
# matches.