16

これは、何か単純なものが欠けていると確信しているものの 1 つですが... 以下のサンプル プログラムでは、Python の RE ライブラリを使用して文字列 "line" を解析し、浮動小数点を取得しようとしています。パーセント記号の直前の数字、つまり「90.31」。ただし、コードは常に「一致なし」と出力します。

他の正規表現もいくつか試しましたが、すべて同じ結果になりました。私は何が欠けていますか?

#!/usr/bin/python
import re
line = '    0 repaired, 90.31% done'
pct_re = re.compile(' (\d+\.\d+)% done$')
#pct_re = re.compile(', (.+)% done$')
#pct_re = re.compile(' (\d+.*)% done$')
match = pct_re.match(line)
if match: print 'got match, pct=' + match.group(1)
else: print 'no match'
4

3 に答える 3

32

match文字列の先頭からのみ一致します。代わりに実行すると、コードは正常に機能しますpct_re.search(line)

于 2013-07-16T15:23:15.163 に答える
7

re.findall代わりに次を使用する必要があります。

>>> line = '    0 repaired, 90.31% done'
>>> 
>>> pattern = re.compile("\d+[.]\d+(?=%)")
>>> re.findall(pattern, line)
['90.31']

re.match文字列の先頭で一致します。したがって、完全な文字列の正規表現を作成する必要があります。

于 2013-07-16T15:24:09.563 に答える
2

本当にマッチを使いたい場合は、これを試してください:

re.match(r'.*(\d+\.\d+)% done$', line)

r'...' は、いくつかのエスケープ シーケンスを無視する「生の」文字列です。これは、Python で正規表現を使用するのに適しています。– kratenko (以下のコメントを参照)

于 2013-07-16T15:25:46.887 に答える