0

ちょっとした問題があります。正規表現を使用して構成ファイル (wvdial の wvdial.conf) を解析するモジュールを作成しました。ファイルには次のような文字列が含まれており"Init1 = AT"、次の正規表現を使用しました:

match = re.match(r'(.*)=(.*)', line)

次の行まですべてが機能しました:

#Init3 = AT+CPIN="0000"

次のように解析されました:

'#Init3 = AT+CPIN':'0000'

正規表現エンジンが文字列を右から左に解析しているようです。研究の方向を逆にする方法はありますか?

4

3 に答える 3

2

*を追加して、最初の量指定子を非貪欲としてマークする必要があります?

match = re.match(r'(.*?)=(.*)', line)

デモ:

>>> line = '#Init3 = AT+CPIN="0000"'
>>> re.match(r'(.*?)=(.*)', line).group()
'#Init3 = AT+CPIN="0000"'

量指定子を貪欲でないようにすることで、正規表現エンジンはパターンを満たす最大値ではなく最小値に一致します。

于 2013-08-10T17:16:16.933 に答える
1

いいえ Python re は右から左に解析しませんが、 .* はデフォルトで貪欲で、取得できる最長の一致を探します。正規表現をいくつかの方法で機能させることができます。最も簡単なのは次のとおりです。

re.match(r'([^=]+)=(.*)', line)

これは、マッチの最初の部分が = で、次に = で、最初の = の後のあらゆるものにマッチします。

デモ:

>>> import re
>>> line = '#Init3 = AT+CPIN="0000"'
>>> re.match(r'([^=]+)=(.*)', line).groups()
('#Init3 ', ' AT+CPIN="0000"')
>>> 
于 2013-08-10T17:21:38.110 に答える
0

間違ったツールを使用していると思います。wvdial.conf は実際には.iniファイル形式のようです。Python にはConfigParserモジュールが付属しており、簡単に処理できます。

import ConfigParser

# Sample wvdial.conf
'''
[Dialer Defaults] 
Modem = /dev/ttyS2 
Baud = 57600 

[Dialer shh] 
Init3 = ATM0

[Dialer pulse] 
Dial Command = ATDP
'''

configuration = ConfigParser.SafeConfigParser()
configuration.read('wvdial.conf')
init3 = configuration.get('Dialer shh', 'Init3') # ATM0
print init3
于 2013-08-10T17:33:14.917 に答える