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