正規表現の最初の一致を取得したい。
この場合、リストを取得しました:
text = 'aa33bbb44'
re.findall('\d+',text)
['33'、 '44']
リストの最初の要素を抽出できます。
text = 'aa33bbb44'
re.findall('\d+',text)[0]
「33」
ただし、少なくとも1つの一致がある場合にのみ機能します。一致しない場合、エラーが発生します。
text = 'aazzzbbb'
re.findall('\d+',text)[0]
IndexError:インデックスが範囲外です
その場合、関数を定義できます。
def return_first_match(text):
try:
result = re.findall('\d+',text)[0]
except Exception, IndexError:
result = ''
return result
新しい関数を定義せずにその結果を取得する方法はありますか?
''
を追加することで、正規表現に|$
デフォルトを埋め込むことができます。
>>> re.findall('\d+|$', 'aa33bbb44')[0]
'33'
>>> re.findall('\d+|$', 'aazzzbbb')[0]
''
>>> re.findall('\d+|$', '')[0]
''
他の人が指摘したre.search
でも動作します:
>>> re.search('\d+|$', 'aa33bbb44').group()
'33'
>>> re.search('\d+|$', 'aazzzbbb').group()
''
>>> re.search('\d+|$', '').group()
''
最初の一致だけが必要な場合は、re.search
の代わりに re.findall
を使用します。
>>> m = re.search('\d+', 'aa33bbb44')
>>> m.group()
'33'
>>> m = re.search('\d+', 'aazzzbbb')
>>> m.group()
Traceback (most recent call last):
File "<pyshell#281>", line 1, in <module>
m.group()
AttributeError: 'NoneType' object has no attribute 'group'
次に、m
をチェック条件として次のように使用できます。
>>> m = re.search('\d+', 'aa33bbb44')
>>> if m:
print('First number found = {}'.format(m.group()))
else:
print('Not Found')
First number found = 33
私は一緒に行きます:
r = re.search("\d+", ch)
result = return r.group(0) if r else ""
re.search
は文字列内のfirstマッチのみを探すので、findall
を使用するよりも意図が少し明確になると思います。
できるよ:
x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''
あなたの質問は正規表現に正確に関連していないことに注意してください。むしろ、配列に要素がない場合、どのようにして配列から要素を安全に見つけることができますか。
多分これは、より多くの入力データに必要なピースが含まれていない場合、exceptの方がコストが高いため、少し良くなります。
def return_first_match(text):
result = re.findall('\d+',text)
result = result[0] if result else ""
return result