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 回答