如何解析['i386', 'x86_64']
之类的字符串中的'-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'
?
>>> my_arch_parse_function('-foo 23 -bar -arch i386 -arch x86_64 -isysroot / -fno-strict-aliasing -fPIC')
>>> ['i386', 'x86_64']
这可以使用正则表达式完成,还是仅使用PyParsing等模块,或者手动拆分并迭代拆分?
假设:-arch VAL
组合在一起。
答案 0 :(得分:4)
为什么不使用参数解析模块? Python 2.6(和3.1)中的optparse和Python 2.7(和3.2)中的argparse。
编辑:第二个想法,这并不像听起来那么简单,因为您可能必须定义您可能会看到的所有参数(不确定这些模块是否具有捕获机制)。我会在这里留下答案,因为可能会有效,但是要带上一粒盐。答案 1 :(得分:3)
正则表达式:(?<=-arch )[^ ]+
>>> re.findall( r"(?<=-arch )([^ ]+)", r"'-foo 23 -bar -arch ppc -arch i386 -isysroot -fno-strict-aliasing -fPIC'" )
['ppc', 'i386']
>>> foo = re.compile( r"(?<=-arch)\s+[^\s]+" )
>>> [ str.strip() for str in re.findall( foo, r"'-foo 23 -bar -arch ppc -arch i386 -isysroot -fno-strict-aliasing -fPIC'" ) ]
['ppc', 'i386']
P.S。该字符串中没有x86_64
,您是否尝试区分-arch ppc
和-arch i386
?
答案 2 :(得分:2)
您会考虑使用非正则表达式解决方案吗?更简单的:
>>> def my_arch_parse_function(s):
... args = s.split()
... idxs = (i+1 for i,v in enumerate(args) if v == '-arch')
... return [args[i] for i in idxs]
...
...
>>> s='-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'
>>> my_arch_parse_function(s)
['ppc', 'i386']
答案 3 :(得分:0)
回答我自己的问题,我通过this tool找到了正则表达式:
>>> regex = re.compile("(?P<key>\-arch\s?)(?P<value>[^\s]+?)\s|$")
>>> r = regex.search(string)
>>> r
<_sre.SRE_Match object at 0x8aa59232ae397b10>
>>> regex.match(string)
None
# List the groups found
>>> r.groups()
(u'-arch ', u'ppc')
# List the named dictionary objects found
>>> r.groupdict()
{u'key': u'-arch ', u'value': u'ppc'}
# Run findall
>>> regex.findall(string)
[(u'-arch ', u'ppc'), (u'-arch ', u'i386'), (u'', u'')]
答案 4 :(得分:0)
如果你想要正则表达式,试试这个:
arch_regex = re.compile('\s+('+'|'.join(arch_list)+')\s+',re.I)
results = arch_regex.findall(arg_string)
根据我的口味有点太多正则表达式,但它确实有效。为了将来参考,最好使用optparse进行命令行选项解析。
答案 5 :(得分:0)
使用Python2.6手工制作 我相信你或图书馆可以做得更好。
inp = '-foo 23 -bar -arch ppc -arch i386 -isysroot / -fno-strict-aliasing -fPIC'.split()
dct = {}
noneSet = set([None])
flagName = None
values = []
for param in inp:
if param.startswith('-'):
flagName = param
if flagName not in dct:
dct[flagName] = set()
dct[flagName].add(None)
continue
# Else found a value
dct[flagName].add(param)
print(dct)
result = sorted(dct['-arch'] - noneSet)
print(result)
>>> ================================ RESTART ================================
>>>
{'-arch': set(['ppc', 'i386', None]), '-isysroot': set([None, '/']), '-fno-strict-aliasing': set([None]), '-fPIC': set([None]), '-foo': set([None, '23']), '-bar': set([None])}
['i386', 'ppc']
>>>