在Python中以位置匹配的子串

时间:2010-07-28 18:14:18

标签: python regex parsing

如何解析['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组合在一起。

6 个答案:

答案 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']
>>>