我有一个小问题。我编写了一个模块来使用正则表达式解析配置文件(wvdial 的 wvdial.conf)。文件包含类似的字符串"Init1 = AT"
,我使用了以下正则表达式:
match = re.match(r'(.*)=(.*)', line)
一切正常,直到下一行:
#Init3 = AT+CPIN="0000"
解析如下:
'#Init3 = AT+CPIN':'0000'
似乎正则表达式引擎从右到左解析字符串。有没有办法扭转研究方向?
您需要*
通过附加将您的第一个量词标记为非贪婪?
:
match = re.match(r'(.*?)=(.*)', line)
演示:
>>> line = '#Init3 = AT+CPIN="0000"'
>>> re.match(r'(.*?)=(.*)', line).group()
'#Init3 = AT+CPIN="0000"'
通过使量词非贪婪,正则表达式引擎将匹配最小值以满足模式,而不是最大值。
没有 python re 不会从右到左解析,但是.* 默认情况下是贪婪的,它会寻找它可以获得的最长匹配,你可以让你的正则表达式以几种方式工作,最简单的是:
re.match(r'([^=]+)=(.*)', line)
这将匹配除 = 作为匹配的第一部分之外的任何内容,然后 = 然后在第一个 = 之后的任何内容
演示:
>>> import re
>>> line = '#Init3 = AT+CPIN="0000"'
>>> re.match(r'([^=]+)=(.*)', line).groups()
('#Init3 ', ' AT+CPIN="0000"')
>>>
我相信你使用了错误的工具。看来 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