web-dev-qa-db-ja.com

最初に一致した正規表現を持つ文字列を返します

正規表現の最初の一致を取得したい。

この場合、リストを取得しました:

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()
''
68
Stefan Pochmann

最初の一致だけが必要な場合は、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
31
Iron Fist

私は一緒に行きます:

r = re.search("\d+", ch)
result = return r.group(0) if r else ""

re.searchは文字列内のfirstマッチのみを探すので、findallを使用するよりも意図が少し明確になると思います。

6
Bill

できるよ:

x = re.findall('\d+', text)
result = x[0] if len(x) > 0 else ''

あなたの質問は正規表現に正確に関連していないことに注意してください。むしろ、配列に要素がない場合、どのようにして配列から要素を安全に見つけることができますか。

2

多分これは、より多くの入力データに必要なピースが含まれていない場合、exceptの方がコストが高いため、少し良くなります。

def return_first_match(text):
    result = re.findall('\d+',text)
    result = result[0] if result else ""
    return result
1
Marko Mackic