2017-07-14 13 views
1

私は文字列のリストを持っており、その部分文字列を空白に部分的に一致させることによってサブ文字列と一致する文字列内のトークンを抽出します。Python Regexが文字列内のアイテムと一致し、サブアイテムが存在する場合はアイテムを返します

l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars'] 
for s in l: 
    if "cat" in s: 
     #match cat until whitespace 
     print re.search("(cat).*[^\s]+",s).groups() 

しかしこれだけ猫を返します。

(u'cat',) 
(u'cat',) 

私がしたい:私はあなただけcatre.search(r"cat\S*",s)後の任意の非空白文字を一致させたいと思います

cats 
catnip 

答えて

0

あなたは '猫' で始まる任意の単語を一致させたいような音:

import re 
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars'] 
for s in l: 
    if "cat" in s: 
     print re.search("cat\w*",s).group() 

はこれが返されます:

あなたが使用することもでき
cats 
catnip 

を:

print re.search("cat[^\s]*",s).group() 

または

print re.search("cat\S*",s).group() 

詳細:

あなたの正規表現でこれらの問題があります:"(cat).*[^\s]+"。最初は括弧内の唯一の部分文字列であるため "cat"のみをグループ化しているため、.groups()を使用して一致するグループを印刷するときには "cat"しか印刷されません。 2番目は.*で、(cat)に続き、スペースを含めてゼロ以上の任意の文字にマッチするので、正規表現は文字列全体とマッチしてから、 "スペースではない"文字一致、[^\s]になります。

もう1つの問題は、.groups()を使用して、一致するすべてのグループを含むタプルを返すことです。あなたの場合、1つのグループしか持たないので、1つのグループしか持たないタプルを返します。例えば:

l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars'] 
for s in l: 
    if "cat" in s: 
     print re.search("(cat\w*)",s).groups() 

は、(一つだけのグループでそれぞれ)これらのタプルを返します。

(u'cats',) 
(u'catnip',) 

あなただけのタプルを必要としない一つのグループを持っているので、あなたは.group()を使用することができますので:

print re.search("(cat\w*)",s).group() 

それだけでマッチしたグループ返すようにするために:

cats 
catnip 

さらに、グループは完全一致であるため、グループ化する必要はありません(つまり、かっこは必要ありません)。マッチ全体を返す.group(0).group()デフォルト:あなたが欲しいものを

print re.search("cat\w*",s).group() 

プリント。

は最後に、それはまた、単語catに一致するように*\w[^\s]、および\S後に使用されることに注意してください。

0

は、このために十分です。

import re 
l=[u'i like cats and dogs',u'i like catnip plant', u'i like cars'] 
for s in l: 
    #match cat until whitespace 
    m = re.search(r"cat\S*",s) 
    if m: 
     print(m.group()) 

Python demo

はパターンが一致ください:

  • catからcatサブ
  • \S*から0以上の非空白文字を(あなただけ文字を一致させる必要がある場合[^\W\d_]*パターンに置き換えてください)。

、パターン場合は鈍感するre.search方法re.Iフラグを渡す、またはパターンの開始時(?i)インライン修飾バージョンを追加します。

関連する問題